力扣27. 移除元素 關於remove和erase在容器中用法
阿新 • • 發佈:2022-02-18
給你一個數組nums
和一個值val
,你需要原地移除所有數值等於val
的元素,並返回移除後陣列的新長度。
不要使用額外的陣列空間,你必須僅使用O(1)
額外空間並原地修改輸入陣列。
元素的順序可以改變。你不需要考慮陣列中超出新長度後面的元素
解:
class Solution { public: int removeElement(vector<int>& nums, int val) { nums.erase( remove(nums.begin(), nums.end(), val), nums.end() ); int n = nums.size(); return n; } };
在做這個題時候發現remove無法處理連續的重複數字,
該函式不能更改包含元素範圍的物件的屬性(即,它不能更改陣列或容器的大小):刪除是通過將比較等於val的元素替換為下一個不等於 val 的元素來完成的。,並通過將迭代器返回到應該被視為其新的過去元素的元素來發出縮短範圍的新大小的訊號。
保留未刪除元素的相對順序,而返回的迭代器和最後一個元素之間的元素處於有效但未指定的狀態。
返回值是 指向未刪除的最後一個元素之後的元素的迭代器
remove 原始碼
template <class ForwardIterator, class T> ForwardIterator remove (ForwardIterator first, ForwardIterator last, const T& val) { ForwardIterator result = first; while (first!=last) { if (!(*first == val)) { if (result!=first) *result = move(*first); ++result; } ++first; } return result; }
std::向量::erase
從向量中刪除單個元素 (position) 或一系列元素 ([first,last))。
這通過刪除的元素數量有效地減小了容器大小,這些元素被破壞了。
因為向量使用陣列作為它們的底層儲存,擦除除向量末端以外的位置的元素會導致容器將擦除段後的所有元素重新定位到它們的新位置。與其他型別的序列容器(例如list或forward_list)為相同操作執行的操作相比,這通常是一種低效的操作。