前面一节我们学习了复制算法copy_n()函数,读者是否还记得它的功能是什么吗?没错,该函数能够从指定位置开始复制固定数量的元素到目标区域。本节我们将学习一个更智能的复制算法——条件复制算法copy_if()函数。从名称就能看出,这个函数在复制时会进行条件筛选,只复制满足特定条件的元素。

copy_if()函数的语法格式如下:

template< class InputIt, class OutputIt, class UnaryPredicate >
OutputIt copy_if( InputIt first, InputIt last,
                  OutputIt result,
                  UnaryPredicate pred );

copy_if(first, last, result, pred) 函数的功能是:遍历区间[first, last)中的每个元素,对每个元素应用判断条件pred,如果条件返回true,则将该元素复制到以result为起始位置的目标区域。

下面我们通过代码来演示copy_if()函数的实际应用:

#include<iostream>
#include<vector>
#include<algorithm>
#include<iterator>//移动迭代器 
#include<string>
using namespace std;
/*copy_if()函数*/ 
void test() {
    vector<string> v1{"编", "程", "学", "习", "可", "以", "访", "问"};
    
    vector<string> v2{"d","o","t","c","p","p",".","c","o","m"}; 
    /*使用back_inserter()迭代器适配函数自动扩容+匿名函数*/ 
    copy_if(v2.begin(), v2.end(), back_inserter(v1),[](const string&s){
    return  s.size() ==1;
});
    for_each(v1.begin(), v1.end(), [](const string& s){
        cout << s;
    });
    cout << endl;
} 
int main(){
    system("title dotcpp.com");
    test();
    return 0;
}

编译结果如下:

copy_if()函数

总结:copy_if()函数提供了一个强大的条件复制机制,它遍历源区间的每个元素,只将满足pred条件的元素复制到目标区间。与copy_n()相比,copy_if()不需要预先知道要复制多少元素,也不需要目标容器有精确的空间,我们可以方便地使用back_inserter()来自动处理容器扩容。在蓝桥杯、ACM等算法竞赛上该函数主要运用于数据筛选、条件提取、数据清洗等场景,是STL算法库中非常实用的工具之一。

点赞(0)

C语言网提供由在职研发工程师或ACM蓝桥杯竞赛优秀选手录制的视频教程,并配有习题和答疑,点击了解:

一点编程也不会写的:零基础C语言学练课程

解决困扰你多年的C语言疑难杂症特性的C语言进阶课程

从零到写出一个爬虫的Python编程课程

只会语法写不出代码?手把手带你写100个编程真题的编程百练课程

信息学奥赛或C++选手的 必学C++课程

蓝桥杯ACM、信息学奥赛的必学课程:算法竞赛课入门课程

手把手讲解近五年真题的蓝桥杯辅导课程

Dotcpp在线编译      (登录可减少运行等待时间)