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习惯用法。注意需要使用头文件<algorithm>, 否则编译不会通过

SeqContainer<int> 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<NodeRelation> NODE_RELATION_LIST;

typedef std::list<NodeRelation>::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_.<span style="color:#3333ff;">remove_if(NodeCompare(id,nodeid));
</span>
记得有时候在使用list等容器的时候需要使用list.clear()确保这个list开始是处于空的状态

eg 2: std::list<int> 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()

<pre class="cpp" name="code">typedef std::map<int, long> TIMER_MAP;
typedef std::pair<TIMER_MAP::iterator, bool> 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
        {
            <span style="color:#3333ff;">timer_map_.erase(iter++);
</span>        } 
        else
        {
            iter++;
        }
    }
    return ;
4.需要用const_iterator记录迭代器轮询到的一个问题,下次仅仅轮询到这个位置。
	vector<int> list1;
	typedef vector<int>::iterator list_iter;
	typedef vector<int>::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"<<endl;
			iter_rec = iter;
			//iter_rec(iter);
			//advance(iter_rec,distance<list_iter_const>(list1.begin(),iter));
		}
	}
	list_iter iter1 = list1.begin();
	//Iter i(d.begin());//使i指向d的起始位置
    //advance(iter_rec,distance<list_iter>(iter1,iter_rec));

    for(; iter1 != iter_rec; iter1++)
	{
		if(*iter1 == 3)
		{
			cout<<"find 3"<<endl;
		}
	}
5. 需要将const_iterator转换为iterator
<pre class="cpp" name="code">	<span style="color:#ff0000;">list_iter itercopy (list1.begin());
</span>	advance(itercopy,distance<span style="color:#3333ff;"><list_iter_const>(</span>list1.begin(),iter_rec));
	cout<<"itercopy's value"<<*itercopy<<endl;
itercopy必须赋初值,将他移到const_rec所值的迭代器, 最后得到位置为5的iterator
 

你可能感兴趣的:(C++ 迭代器删除remove/erase)