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

时间:2021-02-24 05:22:52

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

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

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

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

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

代码:

 #include <iostream>
#include <vector>
#include <map>
using namespace std; int main()
{
const char* strs[] = {
"str1",
"str2",
"str3",
"str4",
"str5",
"str6",
"str7",
"str8",
"str9",
"str10"
};
cout << "Hello World\n"; map<string, string> list;
vector<string> arr;
for (int i = ; i>=; i--) {
list.emplace(std::make_pair(strs[i], strs[i]));
arr.emplace_back(strs[i]);
}
auto pos = list.end();
pos--;//取得倒数第一个的位置
while (pos!= list.end() && list.size()>)
list.erase(pos--);//关键在这里
while (arr.size() > )
arr.erase(--arr.end());//关键在这里
for (auto s : list) {
cout << s.first.data() << " " << s.second.data() << "\n";
}
for (auto s : arr) {
cout << s.data()<< "\n";
}
return ;
}

输出:

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;
.直接删除指定项
mapA.erase(str1);
.直接删除指定位置的项
mapA.erase(pos);
.删除符合条件的项
for (auto it = _chwList.begin(); it != _chwList.end();) {
if (it->second->Code==`Code`)
_chwList.erase(it++);
else
it++;
}