我有一个地图<string,vector <record =“”>&gt;,如何从vector <record>中删除记录?</record> </string,>

时间:2011-03-15 16:38:09

标签: c++ dictionary vector segmentation-fault

我已尽力尝试所有可能,但未能找到解决方案。请帮忙

我希望在迭代时删除地图中的矢量记录。

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
分段错误

任何帮助表示赞赏

4 个答案:

答案 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 );

它会在迭代器位置删除地图中的项目。

More Info on C++ Vector::Erase()

答案 3 :(得分:0)

而不是使用向量上的条件擦除,而是使用std::remove_if。然后erase成语。它会更快,因为它不会多次移动矢量的所有元素。