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