C++ vector刪除元素(資料)詳解

2020-07-16 10:04:30
正像所說的那樣,只能通過容器的成員函數來刪除元素。可以通過使用 vector 的成員函數 clear() 來刪除所有的元素。例如:
std::vector<int> data(100, 99);// Contains 100 elements initialized to 99
data.clear(); // Remove all elements
第一條語句建立了一個有 100 個 int 型元素的 vector 物件,它的大小和容量都是 100;所有元素的初始值都是 99。第二條語句移除了所有的元素,因此大小變為 0,因為這個操作並沒有改變容器的容量,所以容量還是 100。

可以使用 vector 的成員函數 pop_back() 來刪除容器尾部的元素。例如:
std::vector<int> data(100, 99); // Contains 100 elements initialized to 99
data.pop_back(); // Remove the last element
第二條語句移除了最後一個元素,因此 data 的大小變為 99,容量還是 100。只要不在意元素的順序,就可以通過刪除最後一個元素的方式來刪除容器的任何元素,這不需要移動大量元素。假設要刪除 data 中的第二個元素,可以像這樣操作:
std::swap(std::begin(data)+1,std::end(data)-1);
// Interchange 2nd element with the last data.pop_back(); // Remove the last element
第一條語句呼叫了模板函數 swap(),它在標頭檔案 algorithm 和 utility 中都有定義。這個函數將第二個元素和最後一個元素互相交換。然後呼叫 pop_back() 移除最後一個元素,這樣就從容器中移除了第二個元素。

注意,vector 也有成員函數 swap(),這個函數用來交換兩個 vector 容器中的元素。顯然,這兩個容器的元素型別必須相同。全域性的 swap() 函數只要將兩個容器作為引數,也可以交換它們的元素。

如果要去掉容器中多餘的容量,例如不再向容器中新增新元素,那麼可以通過使用成 員函數 shrink_to_fit() 來實現:
data.shrink_to_fit(); // Reduce the capacity to that needed for elements
不管這個操作是否依賴 STL 的實現,如果它生效了,那麼這個容器現有的疊代器都失效,所以在執行完這個操作後,最好重新獲取疊代器。

可以使用成員函數 erase() 來刪除容器中的一個或多個元素。如果只刪除單個元素,那麼只需要提供一個引數,例如:
auto iter = data.erase(std::begin(data)+1); //Delete the second element
刪除一個元素後,vector 的大小減 1;但容量不變。會返回一個疊代器,它指向被刪除元素後的一個元素。這裡的返回值和表示式 std::begin(data)+1 相關;如果移除了最後一個元素,會返回 std::end(data)。

如果要移除一個元素序列,只需要傳入兩個疊代器,用來指定移除元素的範圍。例如:
// Delete the 2nd and 3rd elements
auto iter = data.erase(std::begin(data)+1,std::begin(data)+3);
不要忘記,第二個疊代器指向這段元素末尾的下一個位置。上面的語句刪除了位於 std::begin(data)+1 和 std::begin(data)+2 的元素。返回的疊代器指向被刪除元素後的位置,它是 std::begin(data)+1 ;如果刪除了最後一個元素,它就是 std::end(data)。

remove() 演算法由定義在 algorithm 標頭檔案中的模板生成,它可以刪除匹配特定值的一段元素。例如:
std::vector<std::string> words { "one", "none","some", "all”, "none", "most","many"};
auto iter = std::remove(std::begin(words), std::end(words), "none");
第二條語句在頭兩個引數指定的元素範圍內,移除了所有匹配 remove() 的第三個引數 string("none") 的元素。移除元素這個表述有一點誤導,remove() 是一個全域性函數,所以它不能刪除容器中的元素。remove() 移除元素的方式和從字串中移除空格的方式相似,都是通過用匹配元素右邊的元素來覆蓋匹配元素的方式移除元素。圖 1 展示了這個過程:


圖 1 remove() 演算法的工作原理