插入新键时保持 unordered_map 的顺序

新手上路,请多包涵

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

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

是否可以保持订单?

原文由 user1436187 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 3.4k
2 个回答

不是 无序的关联 数据结构。但是,其他数据结构保持顺序,例如 std::map 保持数据按其键排序。如果您稍微搜索一下 Stackoverflow,您会发现许多针对具有基于键的快速查找和有序访问的数据结构的解决方案,例如 使用 boost::multi_index

如果只是向容器添加值,并按插入顺序取出它们,那么您可以使用建模队列的东西,例如 std::dequeue 。只需 push_back 添加一个新值,然后 pop_front 删除最旧的值。如果不需要从容器中删除值,那么只需使用 std::vector

原文由 Jens 发布,翻译遵循 CC BY-SA 3.0 许可协议

不,这是不可能的。

std::unordered_map 的使用并不能保证元素顺序。

如果您想保持按映射键排序的元素(如您的示例所示),您应该使用 std::map

如果您需要保留有序对的列表,您可以使用 std::vector<std::pair<std::string,int>>

原文由 Pustovalov Dmitry 发布,翻译遵循 CC BY-SA 3.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题