gpt4 book ai didi

c++ - 插入顺序 std::map

转载 作者:行者123 更新时间:2023-11-28 03:43:56 33 4
gpt4 key购买 nike

我会创建一个关联数组(如 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 访问。

看起来您可能需要一个用于列表迭代器的适配器,它会自动取消引用存储的 map iterator 指向 map 项的指针。

在任何情况下,您都需要遍历列表,而不是从 unordered_map 中的随机点到其中的另一个随机点。


此外:添加元素会导致重新散列,这将使迭代器无效(但不是指针或对元素的引用)。您甚至不应该将迭代器存储到 unordered_map 中。

关于c++ - 插入顺序 std::map,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8280079/

33 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com