STL中,要删除容器内的一个元素,其方法会随着容器类型的不同而不同。
例如,对于STL容器c,c包含int类型的元素,现在需要删除c中等于2014的元素。
序列容器即具有连续内存的容器,如vector,deque,string,其删除特定值的元素的方法最好是使用erase-remove用法。
对于list,则直接可以调用remove方法。
若c是关联容器,即c是set或者map等类型,则正确方法是使用erase方法。
对于容器c,需要删除使下面判别式为true的每一个元素:
对于序列容器,vector,deque,string,list,把每个remove的调用换成调用remove_if就行了:
关联容器并没有提供类似remove_if的方法,因此须写一个循环来遍历c中的所有元素,并在遍历过程中删除满足特定条件的元素。
下面的代码是很多程序员首先能想到的。
可是,当关联容器中的一个元素被删除时,指向该元素的所有迭代器都将失效。一旦执行了c.erase(it),it就变成无效的值。
为了避免这个问题,我们要确保在调用erase之前,有一个迭代器指向c中的下一个元素。下面的代码演示了这个方法。
对于序列容器,如果也要通过遍历循环来删除特定的元素,则不能使用上面的删除关联容器特定元素的方法,因为对vector,string,deque这类序列容器来说,调用erase不仅会使指向被删除元素的迭代器失效,而且也会使被删除元素之后的所有迭代器失效。
下面代码演示了序列容器使用遍历循环来删除元素的方法。
值得注意的是,这种 方法仅对序列容器适用。对于关联容器,若erase的参数是迭代器(erase的参数也可以是里面的元素),则返回值是void。所以上面的方法并不适用于关联容器。
参考资料: