1. 程式人生 > 其它 >C++ remove

C++ remove

技術標籤: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