map,vector 等容器内容的循环删除问题(C++)

 

 map,vector 等容器内容的循环删除问题(C++)

 map,vector等容器的循环删除不能用普通的方法删除:

for(auto p=list.begin();p!=list.end();p++)
   list.erase(p);

类似的方式,会出错的,不信你调试试试 :)

这里使用了一个` iterator` 的一个自增/自减 ,来巧妙的实现了, 删除当前的`iterator,` 但是又给当前的`iterator`赋值为其下一个的操作,不至于删除后,当前的 `iterator` 就失效了!

 代码:

复制代码
 1 #include <iostream>
 2 #include <vector>
 3 #include <map>
 4 using namespace std;
 5 
 6 int main()
 7 {
 8     const char* strs[] = {
 9         "str1",
10         "str2",
11         "str3",
12         "str4",
13         "str5",
14         "str6",
15         "str7",
16         "str8",
17         "str9",
18         "str10"
19     };
20     cout << "Hello World\n";
21 
22     map<string, string> list;
23     vector<string>  arr;
24     for (int i = 9; i>=0; i--) {
25         list.emplace(std::make_pair(strs[i], strs[i]));
26         arr.emplace_back(strs[i]);
27     }
28     auto pos = list.end();
29     pos--;//取得倒数第一个的位置
30     while (pos!= list.end() && list.size()>3)
31         list.erase(pos--);//关键在这里
32     while (arr.size() > 3)
33         arr.erase(--arr.end());//关键在这里
34     for (auto s : list) {
35         cout << s.first.data() << " " << s.second.data() << "\n";
36     }
37     for (auto s : arr) {
38         cout << s.data()<< "\n";
39     }
40     return 0;
41 }
复制代码

  输出:

Hello World
str1 str1
str10 str10
str2 str2
str10
str9
str8

 

使用一个` iterator` 的一个自增/自减 ,来巧妙的实现了:

删除当前的`iterator`,又有给当前的`iterator`赋值为其下一个的位置,不至于删除后,当前的 `iterator` 就失效了!

代码参考:

复制代码
//vector的删除某些项
        //vector<T> list;
    auto& it = list.begin();
    while (it!=list.end()){
        if (it->Code == `Code`)
            it = list.erase(it);//返回下一个元素iterator
        else
            it++;
    }
//map的删除某些项
    //  map<string,T> mapA;
    1.直接删除指定项
    mapA.erase(str1);
    2.直接删除指定位置的项
    mapA.erase(pos);
    3.删除符合条件的项
    for (auto it = _chwList.begin(); it != _chwList.end();) {
        if (it->second->Code==`Code`)
            _chwList.erase(it++);
        else
            it++;
    }
复制代码

 



如果您觉得阅读本文对您有帮助,请点一下“推荐”按钮,您的“推荐”将是我最大的写作动力!欢迎各位转载,但是未经作者本人同意,转载文章之后必须在文章页面明显位置给出作者和原文连接,否则保留追究法律责任的权利。 原文链接:https://www.cnblogs.com/lzpong/p/6963300.html
posted @   _Ong  阅读(4021)  评论(0编辑  收藏  举报
编辑推荐:
· SQL Server 2025 AI相关能力初探
· Linux系列:如何用 C#调用 C方法造成内存泄露
· AI与.NET技术实操系列(二):开始使用ML.NET
· 记一次.NET内存居高不下排查解决与启示
· 探究高空视频全景AR技术的实现原理
阅读排行:
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· AI编程工具终极对决:字节Trae VS Cursor,谁才是开发者新宠?
· 开源Multi-agent AI智能体框架aevatar.ai,欢迎大家贡献代码
· Manus重磅发布:全球首款通用AI代理技术深度解析与实战指南
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
点击右上角即可分享
微信分享提示