C 再學習系列 STL容器刪除操作總結

2021-06-06 21:44:07 字數 2008 閱讀 4214

由於容器所對應不同的迭代器、指標和引用的失效規則 ,使得容器的刪除操作較為複雜。解決問題的最好方法取決於你是怎樣鑑別出哪個物件是要被去掉的,儲存它們的容器的型別,和當你刪除它們的時候你還想要做什麼(如果有的話)。為此分 3 種情況討論:

1) 如果容器是 vector 、 string 或 deque ,使用 erase-remove 慣用法。

2) 如果容器是 list ,使用 list::remove 。

3) 如果容器是標準關聯容器,使用它的 erase 成員函式。

示例:containerc;  // 去除值為 1963 的元素

c.erase(remove(c.begin(), c.end(), 1963), c.end()); // 當 c 是 vector 、 string 或 deque 時, erase-remove慣用法是去除特定值的元素的最佳方法

c.remove(1963);     // 當 c 是 list 時, remove 成員函式是去除特定值的元素的最佳方法

c.erase(1963);     // 當 c 為關聯容器

1) 如果容器是 vector 、 string 或 deque ,使用 erase-remove_if 慣用法。

2) 如果容器是 list ,使用 list::remove_if 。

3) 如果容器是標準關聯容器,使用 remove_copy_if 和 swap( 使用臨時容器 ) ,或寫乙個迴圈來遍歷容器元素,當你把迭代器傳給 erase 時記得後置遞增它。

示例:特定判斷式 : bool badvalue(int x);   // 返回 x 是否是「 bad 」

c.erase(remove_if(c.begin(), c.end(), badvalue),  c.end()); // 當 c 是 vector 、 string 或 deque

c.remove_if(badvalue);     // 當 c 是 list 時

// 關聯容器的刪除 : 使用 「 後置遞增傳給

erase

的迭代器 」 技術

assoccontainerc;

for (assoccontainer::iterator i = c.begin();  // for 迴圈的第三部分是空的

i != c.end();  /*nothing*/ )

else ++i;         // 遞增

}說明:為什麼要使用後置遞增?後置遞增會增加臨時副本,效率低。但此處一定要使用後置遞增。關聯容器的

erase

並不返回刪除後的下乙個有效迭代器,同時刪除後的迭代器是無效迭代器。 為達到刪除單前迭代器同時指向後乙個迭代器,我們必須在刪除前遞增迭代器,同時記錄當前迭代器並刪除。後置遞增操作除增加迭代器外,同時返回遞增前的物件拷貝,完全滿足所需的刪除條件。

1) 如果容器是標準序列容器,寫乙個迴圈來遍歷容器元素,每當呼叫 erase 時記得都用它的返回值更新你的迭代器。

2) 如果容器是標準關聯容器,寫乙個迴圈來遍歷容器元素,當你把迭代器傳給 erase 時記得後置遞增它 ( 例子同上 ) 。

示例:標準序列容器 ( 標準關聯容器,同上 )

for (seqcontainer::iterator i = c.begin();

i != c.end();)                                

else

++i;

}說明:對序列容器為什麼不使用 「 後置遞增你要傳給 erase 的迭代器 」 技術?原因在於 vector 、 string 和deque 容器呼叫 erase 後,不僅使所有指向被刪元素的迭代器失效,也使被刪元素之後 的所有迭代器失效 ( 可能重新分配位址空間 ) 。為了使序列容器的 erase 後,能獲得刪除後的有效迭代器,其 erase 將迭代器作為返回值:一旦刪除完成, erase 返回指向緊接在被刪元素之後的元素的有效迭代器。

注意: list 雖是序列容器,但採用節點儲存方式,故不存在位址重新分配。因此可以像 vector/string/deque一樣或像關聯容器一樣對待 list ;兩種方法都可以為 list 工作。

C 再學習系列 STL容器刪除操作總結

由於容器所對應不同的迭代器 指標和引用的失效規則 使得容器的刪除操作較為複雜。解決問題的最好方法取決於你是怎樣鑑別出哪個物件是要被去掉的,儲存它們的容器的型別,和當你刪除它們的時候你還想要做什麼 如果有的話 為此分 3 種情況討論 1 如果容器是 vector string 或 deque 使用 e...

STL系列 關聯容器的操作

在c 中定義了幾種型別用來表示容器關鍵字和值的型別。對於set,由於儲存的值就是關鍵字,所以,key type和value type是一樣的。set的迭代器是const的!對於set,find呼叫返回的是乙個迭代器,如果我們所給定的關鍵字在set中的時候,迭代器就指向該關鍵字,否則,find返回尾後...

C 學習 STL容器

vector 向量 線性容器 用標準模板,記得加上相應的標頭檔案 include include using namespace std int main 設定向量容量 初始化 v1 0 8 v1 1 8 v1 2 8 宣告迭代器 標準他屬於那個模板 vector iterator v1 iter ...