【发布时间】:2013-10-16 00:27:34
【问题描述】:
我在使用std::multimap::equal_range() 和insert() 时遇到了以下问题。
根据cplusplus.com 和cppreference.com,std::multimap::insert 不会使任何迭代器失效,但下面的代码会导致无限循环:
#include <iostream>
#include <map>
#include <string>
int main(int argc, char* argv[])
{
std::multimap<std::string,int> testMap;
testMap.insert(std::pair<std::string,int>("a", 1));
testMap.insert(std::pair<std::string,int>("a", 2));
testMap.insert(std::pair<std::string,int>("a", 3));
auto range = testMap.equal_range(std::string("a"));
for (auto it = range.first; it != range.second; ++it)
{
testMap.insert(std::pair<std::string,int>("b", it->second));
// this loop becomes infinite
}
// never gets here
for (auto it = testMap.begin(); it != testMap.end(); ++it)
{
std::cout << it->first << " - " << it->second << std::endl;
}
return 0;
}
目的是使用特定键(在本例中为“a”)获取多图中的所有现有项目,并将它们复制到第二个键(“b”)下。实际上,第一个循环永远不会退出,因为it 永远不会匹配range.second。处理完映射中的第三个元素后,++it 让迭代器指向新插入的第一个元素。
我已经在 VS2012、Clang 和 GCC 上尝试过这个,所有编译器似乎都发生了同样的事情,所以我认为它是“正确的”。我是否对“没有迭代器或引用无效。”这句话读得太多了? end() 在这种情况下算不算迭代器?
【问题讨论】:
标签: c++ c++11 iterator multimap