STL容器分为Sequence container(vector, deque, list)和associative container(set, multiset, map, multimap)。 C++标准中, sequence container的erase函数会返回iterator, 但是associative container却不会返回。 Visual STudio中实现了,但是在gcc下却不能编译通过,所以为了解决兼容问题,在gcc需要写成a.erase(b++)
如果容器是一个标准序列容器,则写一个循环来遍历容器中的元素,记住每次掉用erase时,要用它的返回值更新迭代器。
如果容器是一个标准关联容器,则写一个循环来遍历容器中的元素,记住每次把迭代器传给erase时,要对迭代器做后缀递增。
1. 如果容器是vector、string或deque,则使用erase-remove/remove_if习惯用法。注意需要使用头文件
SeqContainer
c.erase(remove(c.begin(),c.end(),1963),c.end());
只有通过这种方式才能使得迭代器恢复正常,不影响下次使用
2. 如果容器是list,则使用list::remove/list::remove_if
list_.remove_if(条件)
push_back, remove
eg1: remove_if
typedef std::list NODE_RELATION_LIST;
typedef std::list::iterator NODE_RELATION_LIST_ITERATOR;
class NodeCompare
{
public:
NodeCompare(int id, int nodeid) : id_(id), node_id_(nodeid)
{
}
bool operator()(const NodeRelation &rel)
{
return (rel.id_ == id_) && (rel.nodeid_ == node_id_);
}
private:
int id_;
int node_id_;
};
NODE_RELATION_LIST nodeList_;
nodeList_.remove_if(NodeCompare(id,nodeid));
记得有时候在使用list等容器的时候需要使用list.clear()确保这个list开始是处于空的状态
eg 2: std::list
int a= 1;
list remove(a);
3. map删除某个迭代器,
timer_map_.insert(TimerValueType(timer_type, timer_sys_id));//only add id which is not -1
erase()
typedef std::map TIMER_MAP;
typedef std::pair TimerMapPair;
typedef TIMER_MAP::value_type TimerValueType;
void StopAllTimer()
{
TIMER_MAP::iterator iter = timer_map_.begin();
long timer_sys_id = -1;
for(; iter != timer_map_.end();)
{
timer_sys_id = iter->second;
if(-1 != timer_sys_id)//if found, it cannot be -1
{
timer_map_.erase(iter++);
}
else
{
iter++;
}
}
return ;
4.需要用const_iterator记录迭代器轮询到的一个问题,下次仅仅轮询到这个位置。
vector list1;
typedef vector::iterator list_iter;
typedef vector::const_iterator list_iter_const;
list_iter_const iter_rec;
for(int i=0; i < 10; i ++)
{
list1.push_back(i+1);
}
for(list_iter iter = list1.begin(); iter != list1.end(); iter++)
{
if(*iter == 5)
{
cout<<"find 5"<(list1.begin(),iter));
}
}
list_iter iter1 = list1.begin();
//Iter i(d.begin());//使i指向d的起始位置
//advance(iter_rec,distance(iter1,iter_rec));
for(; iter1 != iter_rec; iter1++)
{
if(*iter1 == 3)
{
cout<<"find 3"<
5. 需要将const_iterator转换为iterator
list_iter itercopy (list1.begin());
advance(itercopy,distance( list1.begin(),iter_rec));
cout<<"itercopy's value"<<*itercopy<
itercopy必须赋初值,将他移到const_rec所值的迭代器, 最后得到位置为5的iterator