c++ std::multi_map 迭代 equal_range 问题

c++ std::multi_map iterating equal_range problem

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

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 的理解,这个断言在任何情况下都应该总是通过,但它有时会失败并迭代 = 0。

什么情况下可以这样?

好的,我明白了。

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

如果 multimap 不包含某个键的任何元素,则它不会 return map.end() 作为第一个迭代器,而是 return 的迭代器键 Not Less 比请求的键高的第一个元素。因此,如果 multimap 不包含请求的键,if (range.first != map.end()) 仍然会通过,因为第一个和第二个迭代器都将指向具有下一个更大键的元素,但是不会有迭代。