【问题标题】:order of elements in std::unordered_multimapstd::unordered_multimap 中的元素顺序
【发布时间】:2013-01-15 20:32:59
【问题描述】:

如果我有以下代码

std::unordered_multimap<std::string, std::vector<double>> myMap;
std::vector<double> v1, v2, v3;
// init v1, v2, v3....
myMap.insert(std::make_pair<std::string, std::vector<double>("vec", v1));
myMap.insert(std::make_pair<std::string, std::vector<double>("vec", v2));
myMap.insert(std::make_pair<std::string, std::vector<double>("vec", v3));

如果我使用迭代器访问值,它们将始终按以下顺序排列:v1, v2, v3

所以基本上如果我插入相同键但值不同的元素,它们是否总是保留插入顺序?

【问题讨论】:

  • 使用无序容器的最好方法是完全不考虑顺序。完全不依赖订单。如果您出于某种原因查看元素的顺序,您可能使用了错误的容器。无法保证它会保留广告订单。
  • @Troy 我可以改用 std::multimap 吗?
  • 如果您需要关联容器中的插入顺序,您可能需要类似 boost 的 multi_index 之类的东西。 SO上有关于此的其他问题。

标签: c++ stl multimap


【解决方案1】:

我想这是特定于实现的。在unordered_multimap 中,如果实现是桶哈希映射,则具有相同键的元素存储在同一个桶中,在这种情况下,它们可能处于相同的插入顺序(这可能是您的情况)。

但是在unordered_map 实现中,例如,使用开放寻址技术,顺序可能会改变。我不知道是否有 STL 实现在引擎盖下使用不同的实现,但是类的合同没有对同一个键的值的顺序做出任何假设,所以我认为你不能把它当作授予。

取自here

在内部,unordered_map 中的元素不会根据它们的键或映射值按任何特定顺序排序

【讨论】:

  • 为了保持插入顺序,我可以使用简单的多图吗?
  • 无论是unordered_multimap,都不能保证值的顺序,也许在 90% 以下的实现中它会起作用,但在任何情况下都不会被授予。
  • 对不起,我指的是 std::multimap 而不是 std::unordered_multimap
  • 具有相同key的元素的顺序必须是有序的。这是为了实现equal_rangeMSDN 还说:You can always be assured, however, that any subset of elements that have equivalent ordering are adjacent in the controlled sequence.
  • @djWann:我应该澄清一下,这不是一个全序,只是具有相同值的元素是相邻的。
【解决方案2】:

名称中“无序”的全部意义在于您不能依赖于顺序。永远。

如果您检测到任何来自迭代容器的订单,那是巧合或实现的产物。你不应该永远指望它。

【讨论】:

  • 我认为你是对的,但无序部分不是指键,而不是值吗?
  • @AlexChamberlain,它指的是容器做出的保证。在这种情况下,没有任何保证,无论是键还是值。
【解决方案3】:

除非文档说明它们将始终按插入顺序返回,否则您将做错事来依赖它。您今天使用的 STL 实现可能会发生变化。如果地图中有很多条目,您正在使用的实现也可能会以不同的方式工作。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2011-10-10
    • 1970-01-01
    • 2023-01-14
    • 2011-09-04
    • 2012-03-15
    • 1970-01-01
    • 2012-04-08
    • 2012-10-23
    相关资源
    最近更新 更多