C++ 迭代器删除remove/erase

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. 如果容器是vectorstringdeque,则使用erase-remove/remove_if习惯用法。注意需要使用头文件, 否则编译不会通过

SeqContainer c;

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 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
 
 

你可能感兴趣的:(C++,language)