前面一节我们学习了条件复制算法copy_if()函数,读者是否还记得它的功能是什么吗?没错,该函数能够根据条件筛选元素并复制到目标区域。本节我们将学习一个反向复制算法——copy_backward()函数。”back“意为”后面“,”forward“意为”朝某个方向“,从名称就能看出,这个函数与常规复制方向不同,它从序列的末尾开始向开头进行复制。

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

template< class BidirectionalIterator1, class BidirectionalIterator2 >
BidirectionalIterator2 copy_backward( BidirectionalIterator1 first,
                                      BidirectionalIterator1 last,
                                      BidirectionalIterator2 last2 );

copy_backward(first1, last1, last2) 函数的功能是:将区间[first1, last1)中的元素按从后往前的顺序复制到以last2为结束位置的目标区域。注意,last2指向的是目标区间的尾后位置,复制从最后一个元素开始向前进行。比如我们有两个序列:序列1{1,2,3,4,5,?,?,?,?,?}这里‘?’表示容器resize()出来的默认元素,序列2{6,7,8,9,10},我们想要把序列2复制到序列1里面去,此时我们传入的第三个参数只能是指向序列1中最后一个‘?’的尾后迭代器,而不是指向序列1中第一个‘?’的迭代器。

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

#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_backward()要求迭代器为双向迭代器,而back_inserter()只能作用于输出迭代器,所以只能手动扩容*/ 
    v1.resize(v1.size()+v2.size());
    copy_backward(v2.begin(), v2.end(), v1.end()); 
    for_each(v1.begin(), v1.end(), [](const string& s){
    cout << s;
    });
    cout << endl;
} 
int main(){
    system("title dotcpp.com");
    test();
    return 0;
}

编译结果如下:

copy_backward()函数

读者请注意我们这里传入copy_backward()的第三个参数,这里是v1.end()而不是prev(v1.end(),v2.size())!看到”编程学习可以访问dotcpp.com“能够完整输出,输出符合我们的预期。

总结:copy_backward()函数提供了一个反向复制的机制,它从源区间的末尾开始向前复制元素到目标区间;同时在蓝桥杯、ACM等算法竞赛上,理解copy_backward()的特性可以帮助我们更好地处理复杂的内存操作问题,是STL算法库中一个重要且实用的工具。

点赞(0)

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

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

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

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

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

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

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

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

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