在插入新密钥时保持unordered_map的顺序

时间:2016-01-28 05:33:24

标签: c++ c++11

我使用以下代码将元素插入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;
}

它们与插入它们的顺序不同。

是否可以保留订单?

4 个答案:

答案 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)

非常常见的请求,没有太多干净,简单的解决方案。但是它们在这里:

  1. 大库:https://www.boost.org/doc/libs/1_71_0/libs/multi_index/doc/tutorial/index.html使用唯一索引std :: string(或者是char?)和顺序索引来保留顺序。
  2. 使用2个STL容器自己编写:组合使用std :: unordered_map(如果还希望遍历排序的键顺序,也可以使用std :: map)和一个向量来保留顺序顺序。有几种设置方法,具体取决于键/值的类型。通常在地图中键入,在向量中键入值。则映射为map <“ key_type”,int>,其中int指向向量中的元素,并因此指向值。

我可能会玩一个简单的包装模板,将2个STL容器捆绑在一起,稍后再贴在这里...

我为review here提出了概念证明:

我使用std :: list最终存储订单,因为我想要有效的删除。但是,如果您想按插入顺序随机访问,则可以选择std :: vector。

我使用了成对指针列表,以避免重复存储密钥。

答案 3 :(得分:-3)

是的,有可能!!!!你只需要保留足够的水桶,因此安装或插入不会导致重新散列;并在评论中回答了Smarty Pants先生的说法&#34; unordered_map应该告诉你一些事情&#34; - 它是无序的,因为没有进行排序