📜  C++ STL-algorithm.remove_copy_if()函数(1)

📅  最后修改于: 2023-12-03 14:39:50.663000             🧑  作者: Mango

C++ STL-algorithm.remove_copy_if()函数介绍

概述

C++ STL中提供了很多算法函数,其中remove_copy_if()函数是一种常用的算法函数,用于将符合条件的元素从源区间[begin,end)拷贝到另外一个区间[result,result+old_size-new_size)中。

函数原型
template< class InputIt, class OutputIt, class UnaryPredicate >
OutputIt remove_copy_if( InputIt first, InputIt last, OutputIt d_first, UnaryPredicate p );
参数说明
  • first, last: 源区间[begin,end)的迭代器,用于指定拷贝元素的范围。
  • d_first: 目标区间的起始迭代器,用于指定拷贝元素到哪个区间。
  • p: 一元谓词函数对象,用于指定哪些元素需要被拷贝到另外一个区间中。
返回值

返回值:指向目标区间的末尾迭代器。

使用示例
#include <iostream>
#include <algorithm>
#include <vector>

using namespace std;

bool isOdd(int i) {
    return ((i%2)==1);
}

int main() {
    vector<int> v = {1, 2, 3, 4, 5, 6, 7, 8, 9};
    vector<int> v2(v.size());
    
    auto it = remove_copy_if(v.begin(), v.end(), v2.begin(), isOdd);
    v2.resize(distance(v2.begin(), it));
    
    cout<<"v: ";
    for(auto i:v) {
        cout<<i<<" ";
    }
    
    cout<<"\nv2: ";
    for(auto i:v2) {
        cout<<i<<" ";
    }
    
    return 0;
}

输出结果为:

v: 1 2 3 4 5 6 7 8 9 
v2: 2 4 6 8 
注意事项
  1. 拷贝的元素不包含被删除的元素。
  2. 输出迭代器d_fisrt不能指向源区间中的元素(即源区间和目标区间的前一部分不能重叠)。
  3. 该函数不会改变源区间的元素,只是将符合条件的元素拷贝到目标区间中。
  4. 使用remove_copy_if()函数后,源区间中的原始元素顺序会被保留,不会影响目标区间中元素的顺序。
参考资料