上一节我们学习了排列组合算法is_permutation()函数,读者是否还记得它的功能是什么吗?没错,该函数能够判断两个序列是否互为排列组合。本节我们将学习一个新的算法——复制算法,顾名思义,复制算法的功能就是把一个区间的元素复制到另外一个区间,它是copy_n()函数,该算法要求迭代器至少为输入迭代器。

它的语法功能如下:

template< class InputIt, class Size, class OutputIt >
OutputIt copy_n( InputIt first, Size count, OutputIt result );

copy_n(first1, n, first2) 函数的功能是:从 first1 迭代器开始,复制 n 个元素到以 first2 迭代器为起始位置的目标区域。

下面我们通过代码来简单演示一下:

#include<iostream>
#include<vector>
#include<algorithm>
#include<iterator>//移动迭代器 
#include<string>
using namespace std;
void test() {
    vector<string> v1{"编", "程", "学", "习", "可", "以", "访", "问"};
    
    vector<string> v2{"d","o","t","c","p","p",".","c","o","m"}; 
    v1.resize(v1.size()+v2.size());
    
    copy_n(v2.begin(), v2.size(), prev(v1.end(),v2.size()));
    for_each(v1.begin(), v1.end(), [](const string& s){
        cout << s;
    });
    cout << endl;
} 
int main(){
    system("title dotcpp.com");
    test();
    return 0;
}

编译结果如下:

copy_n(first1 , n ,first2)函数

我们有两个序列v1、v2,需要把v2序列复制到v1之后,我们首先先给v1容器resize()扩容,然后利用迭代器函数prev()进行移动,找到目标容器的构造起点,最后成功输出”编程学习可以访问dotcpp.com“。

读者是否认为复制前我们需要进行扩容比较麻烦,其实我们还可以直接利用迭代器适配函数back_inserter()直接自动扩容,像这样:

vector<string> v1{"编", "程", "学", "习", "可", "以", "访", "问"};
vector<string> v2{"d","o","t","c","p","p",".","c","o","m"}; 
copy_n(v2.begin(), v2.size(), back_inserter(v1));

总结:我们可以通过copy_n()函数指定某个起点复制n个元素都另外一个起点,前提是目标容器得有充分空间;或者我们通过迭代器适配函数自动扩容,实现元素复制行为。

点赞(0)

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

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

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

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

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

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

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

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

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