C++ remove
阿新 • • 發佈:2021-02-18
技術標籤:C++
一、介紹
remove函式會將範圍內所有等於val的值移動位置
remove函式在STL中的原始碼如下
template <class ForwardIterator, class T> ForwardIterator remove (ForwardIterator first, ForwardIterator last, const T& val) { ForwardIterator result = first; while (first!=last) { if (!(*first == val)) { *result = move(*first); //移動待刪除元素的後面的元素 ++result; } ++first; } return result; }
二、例項
例項1
int main() { vector<char>vec; vector<char>::iterator ite; vec.push_back('A'); vec.push_back('A'); vec.push_back('A'); vec.push_back('B'); vec.push_back('B'); vec.push_back('B'); vec.push_back('B'); vec.push_back('A'); vec.push_back('A'); vec.push_back('A'); vector<char>::iterator position = remove(vec.begin(), vec.end(), 'A'); cout << vec.end() - position << endl; for (ite = vec.begin(); ite != vec.end(); ++ite) { cout << *ite << " "; } return 0; }
分析:出現上述執行結果的原因:remove的時候只是通過迭代器的指標向前移動來刪除。按這個程式碼執行一下,當指標移動到倒數第三個A時,result實際上在第二個B那裡,而它前面的序列此時變成了BBBB,然後first指標繼續移動,result一直不動,一直到迴圈結束。所以得到的序列就是你給出的這個BBBBBBBAAA。
如果想真正刪除,就使用:
vec.erase( remove(vec.begin(), vec.end(), 'A'), vec.end() );
它相當於將result位置(原序列第二個B)開始往後的空間全部釋放掉了,得到的就是BBBB。
三、與earse的區別
STL中remove()只是將待刪除元素之後的元素移動到vector的前端,而不是刪除該元素。若要真正移除,需要搭配使用erase()。
erase的作用是刪除掉某個位置position或一段區域(begin, end)中的元素,減少其size,返回被刪除元素下一個元素的位置。
刪除vector中值為val的元素
vec.erase(remove(vec.begin(),vec.end(),val),vec.end());
例項2
重複元素只保留一個,對重複的原地移除。
思路:可以將重複的元素用一個特殊值替代,再統一刪除這個特殊值。
class Solution {
public:
int removeDuplicates(vector<int>& nums) {
if(nums.size()==0)
return 0;
int res=1;
int flag=nums[0];
for(int i=1;i<nums.size();i++)
{
if(nums[i]==flag)
nums[i]=INT_MAX;
else
{
flag=nums[i];
}
}
nums.erase(remove(nums.begin(),nums.end(),INT_MAX),nums.end());
return nums.size();
}
};
int main()
{
vector<int> ans = { 1, 2, 100, 100, 100, 200, 300, 400, 217, 120 };
Solution sol;
sol.removeDuplicates(ans);
for (auto &elem : ans)
{
std::cout << elem << " ";
}
return 0;
}
參考:
https://blog.csdn.net/xzymmd/article/details/83652726
https://blog.csdn.net/cnd2449294059/article/details/75948661