[英]Insert order std::map
我將創建一個關聯數組(如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()傳遞的迭代器無效......為什么? 怎么了?
第一件事是你不能取消引用列表的結束迭代器。 其次,我還懷疑你的yourMap.cend
是否必須從你的yourMap.cbegin
可以訪問。
看起來您可能需要一個適配器用於列表迭代器,它自動解除引用存儲的
映射迭代器
指向映射項的指針。
在任何情況下,您都需要遍歷列表,而不是從unordered_map中的隨機點迭代到其中的另一個隨機點。
另外:添加元素會導致重新散列,這會使迭代器無效 (但不會指針或對元素的引用)。 您甚至不應該將迭代器存儲到unordered_map中。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.