即使在调用multimap :: erase()之后,我还能继续使用多重映射迭代器吗?例如:
Blah::iterator iter;
for ( iter = mm.begin();
iter != mm.end();
iter ++ )
{
if ( iter->second == something )
{
mm.erase( iter );
}
}
Run Code Online (Sandbox Code Playgroud)
是否应该正确运行,或者在调用擦除后迭代器是否无效?像http://www.cplusplus.com/reference/stl/multimap/erase.html这样的参考站点在迭代器的生命周期主题或者建设性/破坏性方法对迭代器的影响方面都非常安静.
要用c ++循环遍历地图,我们就像这样做
map<string,int> mymap;
map<string,int>::iterator it= mymap.begin();
while(it!=mymap.end()) {
//code here
it++;
}
Run Code Online (Sandbox Code Playgroud)
如果在"代码在这里"部分我有一个if语句,如果评估为true,它会从地图中删除一个元素怎么办?我的代码应如何更改,以便仍然按顺序循环遍历所有mymap元素?
我写了这个简单的测试程序.但我无法理解这里发生了什么.因为输出中有一个奇怪的东西:
std::list<std::pair<double,double>> l;
l.push_back({0.3,0.9});
l.push_back({-0.3,0.5});
l.push_back({0.3,0.7});
l.push_back({1.2,1.83});
for(auto it=l.begin(); it!=l.end(); ++it){
double lx= it->first + 0.01;
double ly= it->second + 0.01;
it->first = lx;
it->second = ly;
if(lx < 0.0 || lx > 1.0 || ly < 0.0 || ly > 1.0){
it = l.erase(it);
}
Run Code Online (Sandbox Code Playgroud)
如果我打印列表,我得到:
0.32, 0.92
0.31, 0.71
Run Code Online (Sandbox Code Playgroud)
为什么迭代器会回到第一个元素(两次+0.1)?
我有一个包含以下键值对的地图.{(α,β),(B,Q),(C,R),(d,S),...(G,Z)}
我正在迭代这个地图,并且在每个元素处,我采用一个访问同一个地图的分支,并在满足条件时擦除地图的一个元素.简单地说,当主迭代器处于(bQ)时,分支函数可以擦除(d,S).
这是有效的吗?或者这会出现错误吗?