1. vector容器
1.1 只移除“与某值相等”的第一个元素
思路:利用算法寻找该值的位置,删除该位置指向的元素。
vector<int> coll;
...
// 利用<algorithm>提供的算法find(),返回与val值相等的第一个元素(位置)
auto pos = find(coll.begin(), coll.end(), val);
// 删除与该值相等的第一个元素
if(pos != coll.end())
{
coll.erase(pos);
}
1.2 移除“与某值相等”的的所有元素
vector并没有提供任何函数可以直接移除“与某值相等”的所有元素。这是算法发挥威力的时候。注意:无关联容器提供了这样的函数,参见:2.2节。
vector<int> coll;
...
// remove all elements with value val
coll.erase(remove(coll.begin(), coll.end(), val), coll.end());
思考:为什么remove操作后,还要再嵌套一个erase?
算法应用:http://blog.csdn.net/ifumi/article/details/50937601
2. unodered_multimap/unodered_multiset容器
2.1 只移除“与某值相等”的重复元素中的第一个元素
如果一个unodered_multimap/unodered_multiset容器内含有重复元素,且只想移除其中的第一个元素,不可使用erase()。应该这样做:
unordered_multimap<Key, T> coll;
...
// remove first element with passed value val
auto pos = find(val);
if(pos != coll.end())
{
coll.erase(pos);
}
思考:这里使用了无关联容器中的成员函数find() ,而不是算法find(),前者快速。与1.1中使用的find(beg, end, val)作比较。
2.2 移除“与某值相等”的重复元素中的所有元素
无关联容器提供的erase()移除元素的操作:
- c.erase(val) :移除“与val相等”的所有元素,返回被移除元素的个数;
- c.erase(pos) :移除itrator位置pos上的元素,无返回值;
- c.erase(beg, end) :移除区间[beg, end)内的所有元素,无返回值。
因此,移除“与某值相等”的重复元素中的所有元素就很简单了:
unordered_multimap<Key, T> coll;
...
// remove all element with passed value val
coll.erase(val);