天天看點

STL容器删除操作

連續記憶體容器(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&lt;</code><code>int</code><code>&gt; c;</code>

<code>for</code> <code>( AssocContainer&lt;</code><code>int</code><code>&gt;::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&lt;</code><code>int</code><code>&gt;::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&lt;</code><code>int</code><code>&gt;::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 &lt;&lt; </code><code>"Erasing "</code> <code>&lt;&lt; *i &lt;&lt; </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

繼續閱讀