C++ list(STL list)刪除元素方法詳解

2020-07-16 10:04:29
對於 list 的成員函數 clear() 和 erase(),它們的工作方式及效果,和前面的序列容器相同。list 容器的成員函數 remove() 則移除和引數匹配的元素。例如:
std::list<int> numbers { 2, 5, 2, 3, 6, 7, 8, 2, 9};
numbers.remove(2); // List is now 5 3 6 7 8 9
第二條語句移除了 numbers 中出現的所有值等於 2 的元素。

成員函數 remove_if() 期望傳入一個一元斷言作為引數。一元斷言接受一個和元素同型別的引數或參照,返回一個布林值。斷言返回 true 的所有元素都會被移除。例如:
numbers.remove_if([](int n){return n%2 == 0;});// Remove even numbers. Result 5 3 7 9
這裡的引數是一個 lambda 表示式,但也可以是一個函數物件。

成員函數 unique() 非常有意思,它可以移除連續的重複元素,只留下其中的第一個。例如:
std::list<std::string> words { "one", "two", "two", "two","three", "four", "four"};
words.unique () ; // Now contains "one" "two" "three" "four"
這個版本的 unique() 函數使用 == 運算子比較連續元素。可以在對元素進行排序後,再使用 unique(),這樣可以保證移除序列中全部的重複元素。

過載的 unique() 版本接受一個二元斷言作為引數。使斷言返回 true 的元素被認為是相等的。這提供了一個非常靈活的相等概念。然後就可以將兩個長度或初始字元相同的字串看作相等。這個斷言可以有不同型別的引數,只要 list 疊代器解除參照後的結果可以隱式地相互進行型別轉換。