STL使用迭代器逆向删除

网上有很多这种例子:

void erase(vector<int> &v)
{
	for(vector<int>::reverse_iterator ri=v.rbegin();ri!=v.rend();)
	{
		if(*ri % 2 == 0)
		{
			cout << "Erasing " << *ri << endl;
			v.erase((++ri).base());
			//用base()函数将逆向iterator转换为正向的
		}
		else
		{
			++ri;
		}
	}
}

  但这样再我自己的编译环境中始终异常中断,提示vector iterators incompatible,这种错误的原因就是迭代器与容器不兼容或者失效。

分析一下,erase函数执行完成后返回下个元素的指针,只要将这个指针转换成反向迭代器即可,一试果然如此。

void erase(vector<int> &v)
{
	for(vector<int>::reverse_iterator ri=v.rbegin();ri!=v.rend();)
	{
		if(*ri % 2 == 0)
		{
			cout << "Erasing " << *ri << endl;
			ri = vector<int>::reverse_iterator(v.erase((++ri).base()));    //删除完要重置迭代器
		}
		else
		{
			++ri;
		}
	}
}

另附正向删除:

for (VectorType::iterator it = someVector.begin();; it != someVector.end();)
{

    if (*it== value)
    {
        it = someVector.erase(it);
    }
    else
    {
        ++it;
    }
}

  

时间: 2024-10-13 14:50:06

STL使用迭代器逆向删除的相关文章

STL容器的遍历删除

STL容器的遍历删除 今天在对截包程序的HashTable中加入计时机制时,碰到这个问题.对hash_map中的每个项加入时间后,用查询函数遍历hash_map,以删除掉那些在表存留时间比某个阈值长的表项(当然这个函数是应该运行在另起一个线程上的),但是在按照下面的方法对hash_map(用迭代器)遍历删除时,当找到第一个满足删除条件的元素并将其删除后,程序将提示非法: for(list<int>::iterator iter = m_map.begin(); iter != m_map.en

STL中慎重选择删除元素的方法

 一.要删除容器中有特定值的所有对象 1.如果容器是vector.string或deque,则使用erase-remove习惯用法.例如: vector<int> c; c.erase(remove(c.begin(),c.end(),1963),c.end());//删除值是1963的元素 下面讲一下算法remove: template<classForwardIterator,class T> ForwardIteratorremove(ForwardIterator fi

STL之迭代器(iterator)

1 头文件 所有容器有含有其各自的迭代器型别(iterator types),所以当你使用一般的容器迭代器时,并不需要含入专门的头文件.不过有几种特别的迭代器,例如逆向迭代器,被定义于<iterator>中. 2 迭代器类型 迭代器共分为五种,分别为: Input iterator.Output iterator.Forward iterator.Bidirectional iterator.Random access iterator. 2.1 Input(输入)迭代器 只能一次一个向前读取

stl map高效遍历删除的方法 [转]

for(:iter!=mapStudent.end():) { if((iter->second)>=aa) { //满足删除条件,删除当前结点,并指向下面一个结点 mapStudent.erase(iter++): } else { //条件不满足,指向下面一个结点 iter++: } } 这种删除方式也是STL源码一书中推荐的方式,分析 mapStudent.erase(iter++)语句,map中在删除iter的时候,先将iter做缓存,然后执行iter++使之指向下一个结点,再进入er

STL容器之 元素删除

stl容器的元素删除跟具体的按内存分配方式关系密切.按内存分配方式可以分为节点内存容器和连续内存容器. 节点内存容器指的是一种表现方式,包括list.slist等这样基于节点的容器(链表实现)和set.map.multiset.multimap等关联容器(平衡树实现) 连续内存容器指的是在一块连续的内存上保存元素的连续内存容器,比如vector等. 1.节点内存容器 以list为例,当调用erase函数之后,被删除的元素的迭代器将会失效,则需要在删除之前移动迭代器,并传入原来迭代器的拷贝作为er

Python在迭代器中删除列表元素

在迭代器中删除列表元素是非常危险的,因为迭代器是直接对列表的数据进行引用 把列表拷贝给迭代器,然后对原列表进行删除操作就没问题了 pos=turtle.move() for each_fish in fish[:]: if each_fish.move()==pos: #鱼儿被吃掉 turtle.eat() fish.remove(each_fish) print('有一条鱼被吃') Python的List的底层是实现是一个PyObject*数组.如果每次增加一个元素都扩张内存的话效率太低,在增

逆向删除属性表中的字段

删除属性表中的字段一定要注意循环的方式.如果是for循环,i< FeatureClass.Fields.FieldCount话,每删除一个字段FieldCount属性返回的字段数量将减少一个,也就是你根本不能完全删除想要删除的字段:如果你先把FeatureClass.Fields.FieldCount赋给一个变量count,for循环中使用i<count,最后导致索引越界:所以,建议使用逆向的方法删除字段. IFeatureClass pointFS = GPClass.gpUtilities

带你深入理解STL之迭代器和Traits技法

在开始讲迭代器之前,先列举几个例子,由浅入深的来理解一下为什么要设计迭代器. //对于int类的求和函数 int sum(int *a , int n) { int sum = 0 ; for (int i = 0 ; i < n ; i++) { sum += *a++; } return sum; } //对于listNode类的求和函数 struct ListNode { int val; ListNode * next; }; int sum(ListNode * head) { int

STL的迭代器和类型萃取

今天就可以把STL库中迭代器的实现,和类型萃取好好整理一下了 迭代器的设计思维是STL的关键所在,在STL的实际运用和泛型思维,迭代器都扮演着十分重要的角色,STL力求把数据容器和算法的概念分开来,于是就有了STL的两大部分,容器(container)和泛型算法(algorithms),泛型算法有很多参数都是迭代器. 举一个栗子!泛型算法find()的实现! 1 template<class InputIterator, class T> 2 InputIterator find(InputI