vector循环删除

很普通的算法,在一个循环中检查每个元素,判断条件,如果为真,就删除这个节点,再继续循环。看似简单,但是却一个不大不小的陷阱,这种小问题的结论,总是记不住,每次遇到的时候,都得写一个测试程序来验证,干脆总结一下,做个结论。

最简单的方法

std::remove_if(_First, _Last, Predicate)

STL是用模板实现,简单高效,但是很多情况下,需要在循环中处理其他逻辑,不能直接使用这个函数

 

用erase删除

 

erase有两种原型,删除一个节点和区段删除,对于vector和list,这个操作的定义都是相同的

 

template< class _TYPE, class _A> iterator vector::erase(iterator Iterator );

 

1. 查看STL的源代码,这个函数返回的iterator,是指向下一个有效的节点,(如果没有,就指向end)

 

2. 注意这个定义,在for循环中不能再调用 it++,不然这样就等同于”it+=2″。如果要想在循环中正确的遍历下去,必须要处理erase的返回值,因为调用 list::erase(iterator it)之后,it指向一个被销毁的值,再调用it++,就会内存异常

 

3. vector尽管没有这样的问题,但是在边界也会出现错误。

 

4. 正确的处理很简单:

 

iterator _Last = end();

 

for (iterator _First = begin(); _First != _Last; )

{

if (*_First == _Val)

_First = erase(_First);

else

++_First;

}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
循环删除vector中的元素是一个比较棘手的问题,因为删除元素可能会导致迭代器失效,进而导致程序崩溃或者产生不可预期的结果。 一种解决方法是使用迭代器来删除元素,具体步骤如下: 1. 定义一个迭代器,指向vector的起始位置; 2. 在循环中,使用迭代器遍历vector中的每一个元素; 3. 如果满足删除条件,调用vector的erase()函数删除该元素,并将迭代器指向下一个元素; 4. 如果不满足删除条件,仅将迭代器指向下一个元素。 以下是一个示例代码: ```c++ vector<int> vec = {1, 2, 3, 4, 5}; for (auto it = vec.begin(); it != vec.end(); ) { if (*it % 2 == 0) { it = vec.erase(it); // 删除偶数元素,并将迭代器指向下一个元素 } else { ++it; // 将迭代器指向下一个元素 } } ``` 需要注意的是,在erase()函数中,迭代器会自动指向下一个元素,因此不需要手动将迭代器加1。 另外,也可以使用标准库提供的算法函数remove_if()来实现循环删除元素。具体步骤如下: 1. 使用remove_if()函数将满足删除条件的元素移动到vector的末尾,并返回一个指向新的末尾位置的迭代器; 2. 使用erase()函数删除末尾的无用元素。 以下是一个示例代码: ```c++ vector<int> vec = {1, 2, 3, 4, 5}; vec.erase(remove_if(vec.begin(), vec.end(), [](int x){ return x % 2 == 0; }), vec.end()); ``` 需要注意的是,remove_if()函数会将满足条件的元素移到vector的末尾,并不会真正删除元素,因此需要使用erase()函数将无用元素删除
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值