Effective STL 09 删除元素

************************************************

时间:2013年10月18日

作者:常保龙

地点:核所C105

************************************************ 

          当删除容器中的元素时,总是或多或少遇到一些问题,要么是迭代器失效,要么是效率问题;不过幸好有Effective STL,让自己豁然开朗。如下规则:

1、标准序列容器:vector、deque、string、list

//判断式
bool badValue(int x);//返回x是否是"bad"

a)连续内存容器:vector、deque、string

v.erase(remove(v.begin(), v.end(), 100), v.end());//删除指定值的所有元素,O(n)
v.erase(remove_if(v.begin(), v.end(), badValue), v.end());//删除满足特定判定式的所有元素
//删除元素的同时,在循环体内做事
for (SeqContainer<int>::iterator i = c.begin(); i != c.end();){
	if (badValue(*i)){
		logFile << "Erasing " << *i << '\n'; 
		i = c.erase(i);//返回已删除元素的下一个元素的迭代器
	}
	else{
		++i;
    }
}

b)非连续内存容器:list

v.remove(100);//删除指定元素,O(n)
v.remove_if(v.begin(), v.end(), badValue);//删除满足特定判定式的所有元素
//删除元素的同时,在循环体内做事
for (SeqContainer<int>::iterator i = c.begin(); i != c.end();){
	if (badValue(*i)){
		logFile << "Erasing " << *i << '\n'; 
		/*方法一*/ i = v.erase(i); //返回已删除元素的下一个元素的迭代器
		/*方法二   v.erase(i++);   //返回已删除元素的下一个元素的迭代器*/
	}
	else{
		++i;
    }
}

2 、标准关联容器:set、map、multiset、multimap

v.erase(100);//删除指定元素,O(logn)
//删除满足特定判定式的所有元素
//方法一
AssocContainer<int> goodValues;
remove_copy_if(v.begin(), v.end(), inserter(goodValues, goodValues.end(), badValue));
v.swap(goodValues);
//方法二
for(AssocContainer<int>::iterator i = v.begin(); i != v.end();){
    if(badValue(*i)){
        v.erase(i++);
    }
    else{
        ++i;
    }
}

//删除元素的同时,在循环体内做事
for (AssocContainer<int>::iterator i = c.begin(); i != c.end();){
	if (badValue(*i)){
		logFile << "Erasing " << *i << '\n'; 
		v.erase(i++);   //返回已删除元素的下一个元素的迭代器
	}
	else{
		++i;
    }
}


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值