我已尽力尝试所有可能,但未能找到解决方案。请帮忙
我希望在迭代时删除地图中的矢量记录。
map < string, vector < record> >::iterator map_it;
for(map_it = map_records.begin(); map_it != map_records.end(); ++map_it){
vector < record>::iterator vec_it;
for(vec_it = (*map_it).second.begin(); vec_it != (*map_it).second.end();){
if(condition){
cout << (*map_it).second.size() << endl;
vec_it = map_it->second.erase(vec_it);
cout << (*map_it).second.size()<< endl;
} else {
++vec_it;
}
}
}
我试过这样的事情,
(*map_it).second.erase(vec_it)
如果我查询它的大小并且程序以分段错误结束
输出:
18446744073709551615
18446744073709551615
分段错误
任何帮助表示赞赏
答案 0 :(得分:4)
vec_t = map_it->second.erase(vec_it); //note the assignment!
您还需要立即检查其有效性,因此最好将内循环重写为:
for(vec_it = (*map_it).second.begin(); vec_it != (*map_it).second.end(); )
{
if(condition)
vec_it = map_it->second.erase(vec_it);
else
++vec_it;
}
答案 1 :(得分:2)
你的迭代器是无效的。如果要在迭代过程中擦除向量中的对象,你应该确保使用erase的返回值(这是下一个的迭代器)对象,或vector :: end)并将迭代器设置为,否则它将变为无效,您的程序可能会崩溃。
if(condition){
vec_it = map_it->second.erase(vec_it);
}
//added for completeness
//if the for loop has a ++vec_it, we should break before
//it gets to do it on an end iterator
if(vec_it == map_it->second.end()) {
break;
}
答案 2 :(得分:0)
在条件中,你可以这样做:
vec_it = (*map_it).second.erase( vec_it );
它会在迭代器位置删除地图中的项目。
答案 3 :(得分:0)
而不是使用向量上的条件擦除,而是使用std::remove_if
。然后erase
成语。它会更快,因为它不会多次移动矢量的所有元素。