STL 之 remove方法

先看一段程序

int main()
{
    vector<int>aray;
    aray.push_back(1);
    aray.push_back(6);
    aray.push_back(6);
    aray.push_back(3);
    vector<int>::iterator ite=aray.begin();vector<int>::iterator ite2;
    for(;ite!=aray.end();++ite)
        if(6==*ite)
			ite=aray.erase(ite);
    for(ite=aray.begin();ite!=aray.end();++ite)
        cout<<*ite<<" ";
    return 0;
}
这段代码本意是要删除容器aray中所有值为6的元素,但是结果可能不像我们预见的那样


因为erase()返回的是下一个元素的位置(已向前移动到被删除元素的位置),如果ite++,则ite指向了下下个元素即为3了因此只能删除一个6.
解决办法有两个:
1、在erase之后,紧接着ite--,退回到其前一个元素位置
2、使用erase()与remove()方法
remove是STL中一个方法,头文件在<algorithm>中,remove并没有删除任何元素,它只是让非删除的元素移动到了前面而已,其原理可以有如下程序模拟:
template<class InputIterator, class T>
InputIterator remove_copy(InputIterator first, InputIterator last, const T& value)
{
		InputIterator result=first;
		for(;first!=last;++first)
			if(*first!=value) *result++=*first;
		return result;
}
当当前元素的值不等于被删除元素时,我们就把他移到前面来,最终返回的result指向的是所有非删除元素的后一个位置

例如vector<char> vec={A,A,A,B,B,B,B,A,A,A}      //C++11新标准支持这种写法

remove(vec.begin(),vec.end(),’A’)后

vec变为{B,B,B,B,B,B,B,A,A,A}

返回的iterator指向第5个B

此时如果结合erase就可以将A删除掉

aray.erase(remove(aray.begin(),aray.end(),6),aray.end());
首先remove之后,aray内的元素为{1,3,6,3},remove返回的iterator指向6,此时erase又将指向6到aray.end()的元素删掉,这样就成功了





评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值