【问题标题】:c++ std::multi_map iterating equal_range problemc++ std::multi_map 迭代equal_range问​​题
【发布时间】:2025-11-25 12:40:02
【问题描述】:

我目前正在调试一些代码,但对以下可能的情况感到困惑:

void DoSomething(int cell, const std::multimap<int, const Foo*>& map) {

  auto range = map.equal_range(cell);
  if (range.first != map.end()) {
    int iterated = 0;
    for (auto iter = range.first; iter != range.second; ++iter) {
      iterated++;
    }
    assert(iterated > 0);
  }
}

根据我对std::multimap 的理解,这个断言在任何情况下都应该通过,但有时它会因 iterated = 0 而失败。

什么情况下可以做到?

【问题讨论】:

    标签: multimap


    【解决方案1】:

    好的,我想通了。

    我错误地假设如果多重映射不包含请求的键,equal_range() 将返回 end() 作为第一个迭代器,但这是不正确的。

    如果 multimap 不包含某个键的任何元素,它不会为第一个迭代器返回 map.end(),而是返回一个迭代器到第一个元素的迭代器,其键为 Not Less,而不是请求的键.因此,如果多重映射不包含请求的键,if (range.first != map.end()) 仍然会通过,因为第一个和第二个迭代器都将指向具有下一个更大键的元素,但不会进行迭代。

    【讨论】: