C++ 算法 中的 remove_copy_if函数

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

C++算法 remove_copy_if()函数用于将参数[first,last)中的所有元素复制到从结果开始的参数中,除了pred返回true的那些元素而不干扰其余元素的顺序。

此函数无法更改集合的大小。

  • 它将迭代器返回到参数的新末端。
  • 删除是稳定的,表示未删除的元素的相对顺序保持不变。

remove_copy_if - 语法

template <class InputIterator, class OutputIterator, class UnaryPredicate>
OutputIterator remove_copy_if (InputIterator first, InputIterator last, 
OutputIterator result, UnaryPredicate pred);

remove_copy_if - 参数

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

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

result:一个输出迭代器,它指向要删除元素的参数的初始位置。

pred :必须替换元素的值。

remove_copy_if - 返回值

指向复制参数的新结束位置(最后一个)的前向迭代器,其中包括[first,last)中的所有元素,但pred将返回true的元素除外。

remove_copy_if - 例子1

让我们看一个简单的示例,以演示remove_copy_if()的用法:

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

using namespace std;

int main() {
  vector<int> v = { 2,1,3,4,5,7,6,9,8};

  remove_copy_if(v.begin(), v.end(),
    ostream_iterator<int>(cout, ","),
    [](int x) { return x%2 != 0; });
    
    return 0;
}

输出:

2,4,6,8,

remove_copy_if - 例子2

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

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

using namespace std; 
  
bool IsOdd(int i) { 
return ((i % 2) != 0); 
} 
  
// Function to remove from v1 result vector is v2 
void remove_copy_ifDemo(vector <int> &v1, vector<int> &v2) 
{ 
    remove_copy_if(v1.begin(), v1.end(), v2.begin(), IsOdd); 
} 
  
// Function to print content of vector 
void print(vector<int>&v) 
{ 
    int len = v.size(); 

    for (int i = 0; i < len; i++) 
        cout << v[i] << " "; 
    cout << endl; 
} 
   
int main() 
{ 
   //declare vector v1, v2 
    vector <int> v1, v2(10); 
      
   //push data in vector  
    for(int i = 10; i <= 20; i++) 
        v1.push_back(i); 
      
    cout << "elements of v1 before remove_copy: "; 
    print(v1); 
  
remove_copy_ifDemo(v1,v2); 
      
    cout << "elements of v1 after remove_copy: "; 
    print(v1); 
      
cout << "After removing Odd Numbers from v1"
            " copy result in vector v2" <<endl; 
    print(v2); 
  
return 0; 
}

输出:

elements of v1 before remove_copy: 10 11 12 13 14 15 16 17 18 19 20 
elements of v1 after remove_copy: 10 11 12 13 14 15 16 17 18 19 20 
After removing Odd Numbers from v1 copy result in vector v2
10 12 14 16 18 20 0 0 0 0

remove_copy_if - 例子3

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

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

using namespace std;


int main()
{
    const int MAX_ELEMENTS = 8 ;

   //Define a template class vector of integers
    typedef vector<int > IntVector ;

    //Define an iterator for template class vector of integer
    typedef IntVector::iterator IntVectorIt ;

    //vector containing numbers
    IntVector Numbers(MAX_ELEMENTS), Result(MAX_ELEMENTS) ;

    IntVectorIt start, end, it, last, resultIt ;

    //Initialize vector Numbers
    Numbers[0] = 10 ;
    Numbers[1] = 20 ;
    Numbers[2] = 10 ;
    Numbers[3] = 15 ;
    Numbers[4] = 12 ;
    Numbers[5] = 25 ;
    Numbers[6] = 30 ;
    Numbers[7] = 10 ;

    start = Numbers.begin() ;  //location of first
                               //element of Numbers

    end = Numbers.end() ;      //one past the location
                               //last element of Numbers

    resultIt = Result.begin() ;//location of first
                               //element of Result

   //print content of Numbers
    cout << "Numbers { " ;
    for(it = start; it != end; it++)
        cout << *it << " " ;
    cout << " }\n" << endl ;

   //copy all elements from Numbers to Result
   //skipping any item that >= 25
    last = remove_copy_if(start, end, resultIt,
                          bind2nd(greater_equal<int>(), 25)) ;

    //print number of elements copied to Result
    cout << "Total number of elements copied to Result = "
        << last - resultIt << endl ;

    start = Result.begin() ;  //location of first
                               //element of Result

    end = Result.end() ;      //one past the location
                              //last element of Result

   //print content of Result
    cout << "Result { " ;
    for(it = start; it != end; it++)
        cout << *it << " " ;
    cout << " }\n" << endl ;
    
    return 0;
}

输出:

Numbers { 10 20 10 15 12 25 30 10  }

Total number of elements copied to Result = 6
Result { 10 20 10 15 12 10 0 0  }

remove_copy_if - 例子4

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

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

using namespace std;

bool greathan(int value)
{ return value >7;}
 
int main(void)
{
// vector container
vector <int> vec1, vec2(14);

// vector iterator
vector <int>::iterator Iter1, Iter2, new_end;
int i, j;

// push data in range
for(i = 0; i <= 10; i++)
vec1.push_back(i);
for(j = 0; j <= 2; j++)
vec1.push_back(5); 


// print the data
cout<<"The original vec1 vector data: ";
for(Iter1 = vec1.begin(); Iter1 != vec1.end(); Iter1++)
cout<<*Iter1<<" ";
cout<<endl;

// randomly shuffle the data
random_shuffle(vec1.begin(), vec1.end());
cout<<"\nThe original vec1 vector data randomly shuffled: ";
for(Iter1 = vec1.begin(); Iter1 != vec1.end(); Iter1++)
cout<<*Iter1<<" ";
cout<<endl;

// remove elements with a value greater than 7

new_end = remove_copy_if(vec1.begin(), vec1.end(), vec2.begin(), greathan);
cout<<"\nAfter the remove_copy_if() operation, the vec1 vector is left unchanged as: ";
for(Iter1 = vec1.begin(); Iter1 != vec1.end(); Iter1++)
cout<<*Iter1<<" ";
cout<<endl;
cout<<"\nvec2 vector is a copy of vec1 vector with values greater than 7 removed: ";
for(Iter2 = vec2.begin(); Iter2 != new_end; Iter2++)
cout<<*Iter2<<" ";
cout<<endl;

return 0;

}

输出:

The original vec1 vector data: 0 1 2 3 4 5 6 7 8 9 10 5 5 5 

The original vec1 vector data randomly shuffled: 4 10 5 5 0 5 5 1 6 9 3 7 8 2 

After the remove_copy_if() operation, the vec1 vector is left unchanged as: 4 10 5 5 0 5 5 1 6 9 3 7 8 2 

vec2 vector is a copy of vec1 vector with values greater than 7 removed: 4 5 5 0 5 5 1 6 3 7 2

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

技术教程推荐

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

手把手带你写一门编程语言 -〔宫文学〕

陈天 · Rust 编程第一课 -〔陈天〕

零基础实战机器学习 -〔黄佳〕

玩转Vue 3全家桶 -〔大圣〕

自动化测试高手课 -〔柳胜〕

快速上手C++数据结构与算法 -〔王健伟〕

B端体验设计入门课 -〔林远宏(汤圆)〕

徐昊 · AI 时代的软件工程 -〔徐昊〕

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