我会创建一个关联数组(如std :: map),按插入顺序存储元素。我写了这堂课:
template <typename K, typename V>
class My_Map : public std::unordered_map<K,V>
{
public:
V& operator[]( const K&& key )
{
typename std::unordered_map<K,V>::iterator __i = find(key);
if (__i == std::unordered_map<K,V>::end()) //se non l'ho trovato...
{
__i = insert(__i, std::make_pair(std::move(key), V()) );
mHistory.push_back(__i);std::cout<<"Sto inserendo: "<<key<<std::endl;
}
return (*__i).second;
}
typename std::unordered_map<K,V>::iterator cbegin() const
{
return *mHistory.cbegin();
}
typename std::unordered_map<K,V>::iterator cend() const
{
return *mHistory.cend();
}
private:
std::list<typename std::unordered_map<K,V>::iterator> mHistory;
};
using namespace std;
int main()
{
My_Map<string,int> myMap;
myMap["1"] = 1;
myMap["23"] = 23;
myMap["-3"] = 3;
myMap["23"] = 28;
myMap["last element"] = 33;
for (auto x = myMap.cbegin(); x != myMap.cend(); ++x)//{std::cout<<"sn dentro\n";}
cout<<(*x).first <<"\t"<<x->second<<endl;
}
我使用了unordered_map而不是std :: map,因为当我插入新元素时std :: map混合迭代器。
此代码存在问题:main()中的for失败并出现分段错误。用cbegin()和cend()传递的迭代器无效......为什么?怎么了?
答案 0 :(得分:2)
首先,您不能取消引用列表的结束迭代器。其次,我还怀疑yourMap.cend
是否必须从yourMap.cbegin
可以获得。
看起来你可能需要一个适配器用于列表迭代器,它自动解除引用存储的 map iterator 指向map项的指针。
在任何情况下,您都需要遍历列表,而不是从unordered_map中的随机点迭代到其中的另一个随机点。
另外:添加元素会导致重新散列,这会使使迭代器无效(但不会指针或对元素的引用)。您甚至不应该将迭代器存储到unordered_map中。