C++ STL中不同的复制方法 | std :: copy(),copy_n(),copy_if(),copy_backward()
C++ STL中存在各种类型的copy()函数,允许以不同的方式执行复制操作,它们都具有自己的用途。这些函数都定义在头文件<algorithm>
中。本文介绍这些函数的用法,方便日常编程。
1. copy(strt_iter1,end_iter1,strt_iter2): 通用的copy函数用于将一个容器的元素 复制 到另一个容器中的 范围 内。它需要3个参数:
- strt_iter1: 源容器的开头指针,从这里开始复制元素。
- end_iter1: 源容器的结尾指针,直到这里停止复制元素。
- strt_iter2: 目标容器的开头指针,从这里开始复制元素。
2. copy_n(strt_iter1,num,strt_iter2): 这个版本的copy()函数允许选择在目标容器中复制多少个元素。他同样需要三个参数:
- strt_iter1: 源容器的开头指针,从这里开始复制元素。
- num: 指定从strt_iter1开始复制多少个数字到目标容器。如果输入负数,则不执行任何操作。
- strt_iter2: 目标容器的开头指针,从这里开始复制元素。
// C++ code to demonstrate the working of copy()
// and copy_n()
#include<iostream>
#include<algorithm> // for copy() and copy_n()
#include<vector>
using namespace std;
int main()
{
// initializing source vector
vector<int> v1 = { 1, 5, 7, 3, 8, 3 };
// declaring destination vectors
vector<int> v2(6);
vector<int> v3(6);
// using copy() to copy 1st 3 elements
copy(v1.begin(), v1.begin()+3, v2.begin());
// printing new vector
cout << "The new vector elements entered using copy() : ";
for(int i=0; i<v2.size(); i++)
cout << v2[i] << " ";
cout << endl;
// using copy_n() to copy 1st 4 elements
copy_n(v1.begin(), 4, v3.begin());
// printing new vector
cout << "The new vector elements entered using copy_n() : ";
for(int i=0; i<v3.size(); i++)
cout << v3[i] << " ";
}
输出:
The new vector elements entered using copy() : 1 5 7 0 0 0
The new vector elements entered using copy_n() : 1 5 7 3 0 0
3. copy_if(): 这个函数根据 条件 的“ 结果 ”进行复制。可通过一个 返回布尔值的函数 来实现。
这个函数需要4个参数,其中3个和copy()相似,另一个是函数,当返回true时候把数字复制到容器中,否则不复制。
4. copy_backward(): 这个函数从 后向前 开始将元素复制到目标容器,并一直复制直到所有数字都被复制。复制从“strt_iter2”开始,但在向后的方向上。它也需要与copy()相似的参数。
// C ++代码演示copy_if()和copy_backward()的工作
#include<iostream>
#include<algorithm> // 用于copy_if()和copy_backward()
#include<vector>
using namespace std;
int main()
{
// 初始化源向量
vector<int> v1 = { 1, 5, 6, 3, 8, 3 };
// 声明目标向量
vector<int> v2(6);
vector<int> v3(6);
// 使用copy_if()复制奇数元素
copy_if(v1.begin(), v1.end(), v2.begin(), [](int i){return i%2!=0;});
// 打印新向量
cout << "使用copy_if()输入的新向量元素: ";
for(int i=0; i<v2.size(); i++)
cout << v2[i] << " ";
cout << endl;
// 使用copy_backward()复制前4个元素
// 在倒数第二个位置结束
copy_backward(v1.begin(), v1.begin() + 4, v3.begin()+ 5);
// 打印新向量
cout << "使用copy_backward()输入的新向量元素: ";
for(int i=0; i<v3.size(); i++)
cout << v3[i] << " ";
}
输出:
使用copy_if()输入的新向量元素: 1 5 3 3 0 0
使用copy_backward()输入的新向量元素: 0 1 5 6 3 0
5. 使用插入器复制():
在进行copy()操作之前,让我们先了解inserter()的语法。
插入器()用作目标,用于将容器的元素复制到哪里。
插入器()接受两个参数。第一个是任意类型的容器,第二个是容器的迭代器。
它返回一个在任意类型的容器上工作的insert_iterator实例。这个包装函数有助于创建insert_iterator实例。键入迭代器的名称需要知道容器的精确完整类型,这可能很繁琐,妨碍通用编程。使用此函数可以利用自动模板参数推断,使编译器为您匹配正确的类型。
插入器的语法():
std::inserter(Container& x, typename Container::iterator it);
x: 目标容器,新元素将插入其中。
it: 指向插入点的迭代器。
返回: 将元素插入到由it指示的x位置的insert_iterator。
使用插入器的复制的语法():
copy(strt_iter1, end_iter1, inserter(Container& x, typename Container::iterator it));
// C ++代码演示使用inserter()复制的工作
#include <iostream>
#include <algorithm>
#include <vector>
using namespace std;
int main()
{
vector<int> v1 = {1, 5, 7, 3, 8, 3};
vector<int>::iterator itr;
vector<int> v2;
//使用插入器()
copy(v1.begin(), v1.end(),inserter(v2,itr));
cout << "\n使用插入器输入的新向量元素: ";
for (int i = 0; i < v2.size(); i++)
cout << v2[i] << " ";
}
输出:
使用插入器输入的新向量元素: 1 5 7 3 8 3