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())
仍然会通过,因为第一个和第二个迭代器都将指向具有下一个更大键的元素,但是不会有迭代。
我目前正在调试一些代码,但对以下内容的可能性感到困惑:
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())
仍然会通过,因为第一个和第二个迭代器都将指向具有下一个更大键的元素,但是不会有迭代。