#include <iostream>
#include <vector>
#include <string>
#include <list>
#include <deque>
#include <string>
#include <set>
#include <map>
#include <algorithm>
using namespace std;
//template <class T>
bool delValue(int value)
{
return value == 3;
}
bool delString(char s)
{
return s == 's';
}
template <class T>
void show(const T& stl)
{
for(auto item : stl)
{
cout << item <<endl;
}
}
void stlDel()
{
//顺序容器删除 remove
vector<int> vec = {1,2,3,3,4,5};
//vec.erase(remove(vec.begin(), vec.end(),3), vec.end());
vec.erase(remove_if(vec.begin(), vec.end(), delValue), vec.end());
show(vec);
deque<int> deq = {1,2,3,3,4,5};
//deq.erase(remove(deq.begin(),deq.end(),3), deq.end());
deq.erase(remove_if(deq.begin(),deq.end(),delValue ), deq.end());
show(deq);
string str = "sstring";
//str.erase(remove(str.begin(),str.end(),'s'), str.end());
str.erase(remove_if(str.begin(),str.end(), delString),str.end());
cout <<str <<endl;//tring
//list 自带remove
list<int> l = {1,2,3,4,5,3};
l.remove(3);
show(l);
//关联容器 set map multiset multimap 不能使用remove 直接使用erase
set<int> setDemo = {1,2,3,4};
setDemo.erase(3);
show(setDemo);
map<int,string> mapDemo;
mapDemo[1] = "baidu";
mapDemo[3] = "ali";
mapDemo[2] = "tencent";
mapDemo.erase(3);
for(auto mapItem : mapDemo)
{
cout << mapItem.second <<endl;
}
}
//当删除是需要do something时,remove erase 满足不了,
//可以for 循环,但注意迭代器是否失效
//template <class AssocContainer>
void assocStl(map<int, string>& mapDemo)
{
using iter = map<int, string>::iterator;
for(iter i = mapDemo.begin(); i != mapDemo.end();)
{
if(delValue((*i).first))
{
//do something
mapDemo.erase(i++);
}
else
{
++i;
}
}
for(auto mapItem : mapDemo)
{
cout << mapItem.second <<endl;
}
}
void seqStl(vector<int>& vec)
{
using iter = vector<int>::iterator;
for(iter i = vec.begin(); i != vec.end();)
{
if(delValue(*i))
{
//do something
i = vec.erase(i);
}
else
{
++i;
}
}
show(vec);
}
void delWithDoSomething()
{
map<int,string> mapDemo;
mapDemo[1] = "baidu";
mapDemo[3] = "ali";
mapDemo[2] = "tencent";
assocStl(mapDemo);
vector<int> vec = {1,2,3,3,4,5};
seqStl(vec);
}
int main()
{
stlDel();
delWithDoSomething();
getchar();
return 0;
}
总结:
1. 要删除容器中特定值的所有对象:
如果是vector string deque ,使用erase+remove(remove_if);
如果是list,使用list::remove(remove_if);
如果是关联容器使用其erase或 remove_copy_if+swap
2. 迭代器失效
如果是序列容器或者string,记住每次调用erase时,要用它的返回值更新迭代器
if(delValue(*i))
{
i = vec.erase(i);
}
else
{
++i;
}
如果是关联容器时,记住当把迭代器传给erase时,要对迭代器做后缀递增;
if(delValue((*i).first))
{
mapDemo.erase(i++);
}
else
{
++i;
}