连续内存容器(vector、deque或string)使用 erase-remove。
例:
1
<code>c.erase(</code><code>remove</code><code>(c.begin(), c.end(), 1963), c.end());</code>
当c是vector、string或deque时,erase-remove惯用法是去除特定值的元素的最佳方法;
以上方法也适合于list,但是,list的成员函数remove更高效。
<code>c.</code><code>remove</code><code>(1963);</code>
当c是list时,remove成员函数是去除特定值的元素的最佳方法。
对于关联容器,解决问题的适当方法是调用erase。
<code>c.erase(1963);</code>
当c是标准关联容器时erase成员函数是去除特定值的元素的最佳方法。
对于序列容器(vector、string、deque和list),我们要做的只是把每个remove替换为remove_if。
2
<code>bool</code> <code>badValue(</code><code>int</code> <code>x); </code><code>//返回x是否是“bad</code>
<code>c.erase(remove_if(c.begin(), c.end(), badValue), c.end());</code>
当c是vector、string或deque时这是去掉badValue返回真的对象的最佳方法。
<code>c.remove_if(badValue);</code>
当c是list时这是去掉badValue返回真的对象的最佳方法。
对于标准关联容器
效率低的remove_copy_if。
3
4
5
<code>AssocContainerc;</code>
<code>...</code>
<code>AssocContainergoodValues;</code>
<code>remove_copy_if(c.begin(),c.end(),inserter(goodValues,goodValues.end()),badValue);</code>
<code>c.swap(goodValues);</code>
c现在是一种标准关联容器用于容纳不删除的值的临时容器从c拷贝不删除的值到goodValues交换c和goodValues的内容。
循环迭代删除(注意失效问题)
错误代码:
6
<code>AssocContainer<</code><code>int</code><code>> c;</code>
<code>for</code> <code>( AssocContainer<</code><code>int</code><code>>::iterator i = c.begin(); i!= c.end();++i)</code>
<code>{ </code>
<code> </code><code>if</code> <code>(badValue(*i)) c.erase(i); </code>
<code>}</code>
清晰,直截了当而漏洞百出的用于删除c中的每个元素的代码badValue返回真,不要这么做。
正确的使用方式:
7
8
<code>for</code> <code>( AssocContainer<</code><code>int</code><code>>::iterator i = c.begin(); </code>
<code> </code><code>i != c.end(); </code>
<code> </code><code>/*nothing*/</code> <code>){ </code>
<code> </code><code>if</code> <code>(badValue(*i)) c.erase(i++); </code>
<code> </code><code>else</code> <code>++i; </code>
// for循环的第三部分是空的;i现在在下面自增对于坏的值,把当前的i传给erase,然后作为副作用增加i;对于好的值,只增加i。
必须对vector、string和deque进行循环迭代删除采用不同的战略
(调用erase不仅使所有指向被删元素的迭代器失效,也使被删元素之后的所有迭代器失效)
9
10
<code>for</code> <code>( SeqContainer<</code><code>int</code><code>>::iterator i = c.begin(); i != c.end();)</code>
<code>{</code>
<code> </code><code>if</code> <code>(badValue(*i))</code>
<code> </code><code>{</code>
<code> </code><code>logFile << </code><code>"Erasing "</code> <code><< *i << </code><code>'\n'</code><code>;</code>
<code> </code><code>i = c.erase(i); </code>
<code> </code><code>} </code>
<code> </code><code>else</code>
<code> </code><code>++i;</code>
通过把erase的返回值赋给i来保持i有效。
本文转自永远的朋友博客51CTO博客,原文链接http://blog.51cto.com/yaocoder/1199520如需转载请自行联系原作者
yaocoder