C++ 算法 中的 remove函数

首页 / C++入门教程 / C++ 算法 中的 remove函数

C++算法 remove()函数用于在给定参数内(第一个,最后一个)消除所有等于val的元素,而不会干扰其余元素的顺序。

  • 此函数无法更改集合的大小。
  • 它将迭代器返回到参数的新末端。
  • 删除是稳定的,这意味着不等于val的元素的相对顺序保持不变。
  • 此函数使用operator ==将各个元素与val进行比较。

remove - 语法

template <class ForwardIterator, class T>
ForwardIterator remove (ForwardIterator first, ForwardIterator last, const T& val);

remove - 参数

first:前向迭代器,指向要从中删除元素的参数内第一个元素的位置。

last:正向迭代器,在要删除元素的参数内,将位置指向最后一个元素之后的位置。

val :要从参数中删除的值。

remove - 返回值

如果first和last相等,则前向迭代器指向修改参数或第一个元素的新结束位置(最后)。

remove - 例子1

让我们看一个简单的示例来演示remove()的用法:

#include <iostream>    //std::cout
#include <algorithm>   //std::remove

using namespace std;

int main () {
  int myints[] = {10,20,30,50,20,40,100,20};   

 //bounds of range:
  int* pbegin = myints;                          
  int* pend = myints+sizeof(myints)/sizeof(int); 

  pend = remove (pbegin, pend, 20);        
                                                 
  cout << "range contains:";
  for (int* p=pbegin; p!=pend; ++p)
    cout << ' ' << *p;
  cout << '\n';

  return 0;
}

输出:

range contains: 10 30 50 40 100

remove - 例子2

让我们来看另一个简单的示例,以说明delete()和remove()之间的区别:

#include <iostream>
#include <vector>
#include <algorithm>

int main()
{
	using namespace std;

	//Populate myvec with the data set 10, 5, -8, 5, 1, 4
	vector<int> myvec;
	myvec.push_back(10);
	myvec.push_back(5);
	myvec.push_back(-8);
	myvec.push_back(5);
	myvec.push_back(1);
	myvec.push_back(4);

	cout << "\n Initial data set:	";
	for(size_t i(0); i!=myvec.size(); ++i)
		cout << myvec.at(i) << ' ';

	//Remove the data elements matching '5'
	vector<int>::iterator invalid;
	invalid = remove( myvec.begin(), myvec.end(), 5 );

	cout << "\n\n Data set after remove: ";
	for(size_t i(0); i!=myvec.size(); ++i)
		cout << myvec.at(i) << ' ';

	//Destroy the remaining invalid elements
	myvec.erase( invalid, myvec.end() );

	cout << "\n\n Data set after erase:  ";
	for(size_t i(0); i!=myvec.size(); ++i)
		cout << myvec.at(i) << ' ';
		
		return 0;
}

输出:

  Initial data set:	10 5 -8 5 1 4 

 Data set after remove: 10 -8 1 4 1 4 

 Data set after erase:  10 -8 1 4  

remove - 例子3

让我们看另一个简单的例子:

#include<iostream>
#include<algorithm>
#include<vector>

using namespace std;

bool IsOdd(int i) 
{ 
    return ((i % 2) == 1); 
} 
  
// Driver code 
int main ()  
{ 
    vector <int> vec1 { 10, 20, 30, 30, 20, 10, 10, 20}; 
      
   //Print original vector 
    cout << "Original vector : "; 
    for(int i=0; i < vec1.size(); i++) 
        cout << " " << vec1[i]; 
    cout << "\n"; 
  
   //Iterator that store the position of last element 
    vector <int>::iterator pend; 
      
   //std ::remove function call 
    pend = remove (vec1.begin(), vec1.end() , 20); 
      
   //Print the vector 
    cout << "After remove : "; 
    for ( vector<int> ::iterator p=vec1.begin(); p != pend; ++p) 
        cout << ' ' << *p; 
    cout << '\n'; 
    
    return 0;
}

输出:

Original vector :  10 20 30 30 20 10 10 20
After remove :  10 30 30 10 10

remove - 例子4

让我们看另一个简单的例子:

#include <vector>  
#include <algorithm>  
#include <iostream>  
  
int main( ) {  
   using namespace std;  
   vector <int> v1;  
   vector <int>::iterator Iter1, Iter2, new_end;  
  
   int i;  
   for ( i = 0 ; i <= 9 ; i++ )  
      v1.push_back( i );  
  
   int ii;  
   for ( ii = 0 ; ii <= 3 ; ii++ )  
      v1.push_back( 7 );  
  
   random_shuffle ( v1.begin( ), v1.end( ) );  
   cout << "Vector v1 is ( " ;  
   for ( Iter1 = v1.begin( ) ; Iter1 != v1.end( ) ; Iter1++ )  
      cout << *Iter1 << " ";  
   cout << ")." << endl;  
  
  //Remove elements with a value of 7  
   new_end = remove ( v1.begin( ), v1.end( ), 7 );  
  
   cout << "Vector v1 with value 7 removed is ( " ;  
   for ( Iter1 = v1.begin( ) ; Iter1 != v1.end( ) ; Iter1++ )  
      cout << *Iter1 << " ";  
   cout << ")." << endl;  
  
  //To change the sequence size, use erase  
   v1.erase (new_end, v1.end( ) );  
  
   cout << "Vector v1 resized with value 7 removed is ( " ;  
   for ( Iter1 = v1.begin( ) ; Iter1 != v1.end( ) ; Iter1++ )  
      cout << *Iter1 << " ";  
   cout << ")." << endl; 
   
   return 0;
}

输出:

Vector v1 is ( 4 7 7 7 0 5 7 1 6 9 3 7 8 2 ).
Vector v1 with value 7 removed is ( 4 0 5 1 6 9 3 8 2 9 3 7 8 2 ).
Vector v1 resized with value 7 removed is ( 4 0 5 1 6 9 3 8 2 ).

祝学习愉快!(内容编辑有误?请选中要编辑内容 -> 右键 -> 修改 -> 提交!)

技术教程推荐

推荐系统三十六式 -〔刑无刀〕

从0开始学架构 -〔李运华〕

持续交付36讲 -〔王潇俊〕

后端技术面试 38 讲 -〔李智慧〕

深入浅出云计算 -〔何恺铎〕

Spark核心原理与实战 -〔王磊〕

如何读懂一首诗 -〔王天博〕

数据分析思维课 -〔郭炜〕

工程师个人发展指南 -〔李云〕

好记忆不如烂笔头。留下您的足迹吧 :)