我有一个 map<string, vector<record>>,如何从 vector<record> 中删除记录?

Posted

技术标签:

【中文标题】我有一个 map<string, vector<record>>,如何从 vector<record> 中删除记录?【英文标题】:I have a map<string, vector<record>>, how to remove records from vector<record>? 【发布时间】:2011-03-15 16:38:08 【问题描述】:

我已经尝试了所有可能的方法,但未能找到解决方案。请帮忙

我想在遍历地图时删除矢量中的记录。

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

任何帮助表示赞赏

【问题讨论】:

【参考方案1】:
   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;

【讨论】:

@Ringo:如果您遇到一些错误。然后问题出在其他地方,不再在这个循环中。你为什么不把错误信息也贴出来? @Ringo:你也在for 中做++vec_it 吗?你注意到我没有这样做吗?我的代码只在一个地方增加它! 错误是 18446744073709551615 18446744073709551615 分段错误我只是在条件失败时递增。 @Ringo:你增加了两次吗?也发布您当前正在使用的 for 循环! 这是我的代码中的一个错误。擦除矢量项的方法是正确的。感谢帮助。特别感谢nawaz..【参考方案2】:

您正在使您的迭代器无效。如果您要在迭代时从向量中擦除对象,您应该确保获取擦除的返回值(它是下一个迭代器的迭代器) object 或 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;
    

【讨论】:

【参考方案3】:

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

【讨论】:

【参考方案4】:

在有条件的情况下,你可以这样做:

vec_it = (*map_it).second.erase( vec_it );

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

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

【讨论】:

你打电话的不是地图擦除! 哈哈哈哈哈。哈哈哈哈。哎呀。 >.>

以上是关于我有一个 map<string, vector<record>>,如何从 vector<record> 中删除记录?的主要内容,如果未能解决你的问题,请参考以下文章

01分数规划

hihoCoder week13 最近公共祖先·一

我有一个 map<string, vector<record>>,如何从 vector<record> 中删除记录?

我有两个list,list里面放的是map,我现在需要遍历这两个list,将里面存放的map中key相等的value值相加

如何在二维向量中使用计数

Flutter - Map<String, dynamic> 到 Map<String, MyObject>