我使用以下代码将元素插入unordered_map
:
myMap.insert(std::make_pair("A", 10));
myMap.insert(std::make_pair("B", 11));
myMap.insert(std::make_pair("C", 12));
myMap.insert(std::make_pair("D", 13));
但是当我用这个命令来打印键时
for (const auto i : myMap)
{
cout << i.first << std::endl;
}
它们与插入它们的顺序不同。
是否可以保留订单?
答案 0 :(得分:13)
不,这是不可能的。
std::unordered_map
的使用并不能保证您在元素顺序上有任何保证。
如果你想保持按地图键排序的元素(如你的例子所示),你应该使用std::map
。
如果您需要保留有序对的列表,可以使用std::vector<std::pair<std::string,int>>
。
答案 1 :(得分:3)
不使用无序关联数据结构。但是,其他数据结构保留了顺序,例如std :: map,它使数据按其键排序。如果您稍微搜索Stackoverflow,您会发现许多解决方案,用于具有快速基于密钥的查找和有序访问的数据结构,例如, using boost::multi_index
如果只是向容器中添加值,并按插入顺序取出它们,那么您可以使用对队列建模的内容,例如: std::dequeue
。只需push_back
即可添加新值,pop_front
可删除最旧的值。如果不需要从容器中删除值,那么只需使用std::vector
。
答案 2 :(得分:0)
非常常见的请求,没有太多干净,简单的解决方案。但是它们在这里:
我可能会玩一个简单的包装模板,将2个STL容器捆绑在一起,稍后再贴在这里...
我为review here提出了概念证明:
我使用std :: list最终存储订单,因为我想要有效的删除。但是,如果您想按插入顺序随机访问,则可以选择std :: vector。
我使用了成对指针列表,以避免重复存储密钥。
答案 3 :(得分:-3)
是的,有可能!!!!你只需要保留足够的水桶,因此安装或插入不会导致重新散列;并在评论中回答了Smarty Pants先生的说法&#34; unordered_map应该告诉你一些事情&#34; - 它是无序的,因为没有进行排序