C++ 算法 copy() 函数用于将容器 [first,last] 的所有元素从结果开始复制到不同的容器中。

本文介绍了copy、strcpy、strncpy、memcpy、copy_n、copy_if、copy_backward等使用方法和代码示例

本文作者原创,转载请附上文章出处与本文链接。

C++ copy()函数用法详解目录

1 copy

2 strcpy

3 strncpy

4 memcpy

5 copy_n

6 copy_if

7 copy_backward


1 copy

    //declaring & initializing an int arrayint arr[] = { 10, 20, 30, 40, 50 };//向量声明vector<int> v1(5);//复制数组元素到向量copy(arr, arr + 5, v1.begin());Output://如果我们打印值arr: 10 20 30 40 50v1: 10 20 30 40 50

2 strcpy

char* strcpy( char* dest, const char* src );
  • 拷贝src到dest中,包括结束空字符
  • 如果dest不够大或者两个字符串的范围有重叠,其行为未定义
  • 返回值为dest

#include <iostream>
#include < cstring >int main()
{// strcpychar* s1 ;s1 = (char*)"1234";char s2[3] = { 0 };strcpy(s2, s1);std::cout << "s1: " << s1 << std::endl;std::cout << "s2: " << s2 << std::endl;return 0;
}

3 strncpy

char *strncpy( char *dest, const char *src, std::size_t count );
  • 拷贝src一定数量的字符到dest中,包括结束空字符
  • 如果count比src的长度小,则dest将不是以空字符结尾
  • 如果count比src的长度大,则继续填充空字符到dest中

#include <iostream>
#include < cstring >int main()
{// strncpychar* s1 = (char*)"1234";char s2[10] = { 0 };strncpy(s2, s1, 5);std::cout << "s1: " << s1 << std::endl;std::cout << "s2: " << s2 << std::endl;return 0;
}

4 memcpy

void* memcpy( void* dest, const void* src, std::size_t count );
  • 从src中拷贝count个字节到dest中,过程中dest和src均被重新解释为unsigned char数组
  • 如果dest和src有重叠,则行为未定义
  • 如果dest或src为无效的或者空指针,其行为未定义,即使count为0

#include <iostream>
#include < cstring >int main()
{// memcpychar* s1 = (char*)"1234";char s2[10] = { 0 };memcpy(s2, s1, 5);std::cout << "s1: " << s1 << std::endl;std::cout << "s2: " << s2 << std::endl;return 0;
}

5 copy_n

copy_n() 算法可以从源容器复制指定个数的元素到目的容器中。第一个参数是指向第一个源元素的输入迭代器,第二个参数是需要复制的元素的个数,第三个参数是指向目的容器的第一个位置的迭代器。这个算法会返回一个指向最后一个被复制元素的后一个位置的迭代器,或者只是第三个参数——输出迭代器——如果第二个参数为 0。下面是一个使用它的示例:

#include<iostream>
#include<algorithm>
#include<vector>
using namespace std;int main(int argc, char** argv)
{vector<int> u1 = { 2,6,8,4,9,4 };vector<int> u2(6);vector<int> u3(6);copy(u1.begin(), u1.begin() + 3, u2.begin());cout << "The new vector with copy contains:";for (int k = 0; k < u2.size(); k++)cout << u2[k] << " ";copy_n(u1.begin(), 4, u3.begin());cout << "\n";cout << "The new vector using copy_n contains:";for (int m = 0; m < u3.size(); m++)cout << u3[m] << " ";return 0;
}

6 copy_if

copy_if() 算法可以从源序列复制使谓词返回 true 的元素,所以可以把它看作一个过滤器。前两个参数定义源序列的输入迭代器,第三个参数是指向目的序列的第一个位置的输出迭代器,第 4 个参数是一个谓词。会返回一个输出迭代器,它指向最后一个被复制元素的下一个位置。下面是一个使用 copy_if() 的示例:

#include <vector>
#include <algorithm>
#include <iostream>
#include <numeric>    // accumulate
#include <iterator>
using namespace std;
int main()
{std::vector<bool> flags{ true, true, false, true };std::vector<double> veca{ 0.1, 0.2, 0.3, -0.1 };std::vector<double> vecb;vecb.reserve(std::accumulate(flags.begin(), flags.end(), 0));size_t i = 0;// vecb在reserve之后并没有未元素分配内存,插入应该使用back_inserter(vecb)// vecb在resize之后为元素分配了内存,使用back_inserter(vecb)会在已经分配内存的元素之后插入// 这时应该使用 vecb.begin(),对已经分配的内存进行覆盖std::copy_if(veca.begin(), veca.end(), std::back_inserter(vecb),[&i, &flags](double a) {return flags[i++]; });for (auto& s : vecb)std::cout << s << std::endl;return 0;
}

#include <vector>
#include <algorithm>
#include <iostream>
#include <numeric>    // accumulate
#include <iterator>
using namespace std;
int main()
{std::vector<bool> flags{ true, true, false, true };std::vector<double> veca{ 0.1, 0.2, 0.3, -0.1 };std::vector<double> vecb;vecb.reserve(std::accumulate(flags.begin(), flags.end(), 0));size_t i = 0;i = 0;std::vector<double> vecc;std::remove_copy_if(veca.begin(), veca.end(), std::back_inserter(vecc),[&i, &flags](double a){return flags[i++]; });std::cout << "veca\n";for (auto& s : veca)std::cout << s << "\t";std::cout << "\nvecc\n";for (auto& s : vecc)std::cout << s << "\t";return 0;
}

7 copy_backward

不要被 copy_backward() 算法的名称所误导,它不会逆转元素的顺序。它只会像 copy() 那样复制元素,但是从最后一个元素开始直到第一个元素。
        copy_backward() 会复制前两个迭代器参数指定的序列。第三个参数是目的序列的结束迭代器,通过将源序列中的最后一个元素复制到目的序列的结束迭代器之前,源序列会被复制到目的序列中,如图 1 所示。copy_backward() 的 3 个参数都必须是可以自增或自减的双向迭代器,这意味着这个算法只能应用到序列容器的序列上。

#include <iostream>
#include <vector>
#include <deque>
using namespace std;
void main()
{//创建两个容器 和 两个数组vector<int> v = { 1,2,3,4,5,6,7,8,9,10 };vector<int> v2(10);vector<int>::iterator vi;//迭代器int arr[10] = { 11,12,13,14,15,16,17,18,19,20 };cout << "执行copy算法前:\n";// 输出 vcout << "容器 v:   ";for (vi = v.begin(); vi < v.end(); vi++) { cout << *vi << "\t"; }cout << endl;// 输出 v2   cout << "容器 v2:  ";for (vi = v2.begin(); vi < v2.end(); vi++) { cout << *vi << "\t"; }cout << endl;// 输出 arr   cout << "数组 arr: ";for (int i = 0; i < 10; i++) { cout << arr[i] << "\t"; }cout << endl;cout << "\n执行 copy_backward 算法后:\n";// STL copy_backward算法// 1、拷贝源是容器,拷贝目标是容器copy_backward(v.begin(), v.begin() + 5, v2.end());// 输出 v2 cout << "容器 v2:  ";for (vi = v2.begin(); vi < v2.end(); vi++) { cout << *vi << "\t"; }cout << endl << endl;// 2、拷贝源是数组,拷贝目标是容器copy_backward(arr, arr + 5, v2.end() - 1);// 输出 v2 cout << "容器 v2:  ";for (vi = v2.begin(); vi < v2.end(); vi++) { cout << *vi << "\t"; }cout << endl << endl;// 3、拷贝源是容器,拷贝目标是同一个容器copy_backward(v.begin(), v.begin() + 7, v.end());// 输出 v2   cout << "容器 v :  ";for (vi = v.begin(); vi < v.end(); vi++) { cout << *vi << "\t"; }cout << endl;
}

C++ copy()函数用法详解(深入了解,一文学会)相关推荐

  1. C++ search()函数用法详解(深入了解,一文学会)

    find_end() 函数用于在序列 A 中查找序列 B 最后一次出现的位置.那么,如果想知道序列 B 在序列 A 中第一次出现的位置,该如何实现呢?可以借助 search() 函数. search( ...

  2. C++ reverse()函数用法详解(深入了解,一文学会)

    reverse_copy() 算法可以将源序列复制到目的序列中,目的序列中的元素是逆序的.定义源序列的前两个迭代器参数必须是双向迭代器.目的序列由第三个参数指定,它是目的序列的开始迭代器,也是一个输出 ...

  3. ROW_NUMBER() OVER()函数用法详解 (分组排序 例子多)

    ROW_NUMBER() OVER()函数用法详解 (分组排序 例子多) https://blog.csdn.net/qq_25221835/article/details/82762416 post ...

  4. C++中substr()函数用法详解

    C++中substr()函数用法详解 原型: string substr (size_t pos = 0, size_t len = npos) const; 返回一个新构造的string对象,其值初 ...

  5. LayoutInflater的inflate函数用法详解

    LayoutInflater的inflate函数用法详解 LayoutInflater作用是将layout的xml布局文件实例化为View类对象. 获取LayoutInflater的方法有如下三种: ...

  6. c++ memset 语言_C++中memset函数用法详解

    本文实例讲述了C++中memset函数用法.分享给大家供大家参考,具体如下: 功 能: 将s所指向的某一块内存中的每个字节的内容全部设置为ch指定的ASCII值,块的大小由第三个参数指定,这个函数通常 ...

  7. mysql: union / union all / 自定义函数用法详解

    mysql: union / union all http://www.cnblogs.com/wangyayun/p/6133540.html mysql:自定义函数用法详解 http://www. ...

  8. python中mat函数_Python中flatten( )函数及函数用法详解

    flatten()函数用法 flatten是numpy.ndarray.flatten的一个函数,即返回一个一维数组. flatten只能适用于numpy对象,即array或者mat,普通的list列 ...

  9. (118)System Verilog 父类与子类对象复制(copy函数)详解

    (118)System Verilog 父类与子类对象复制(copy函数)详解 1.1 目录 1)目录 2)FPGA简介 3)System Verilog简介 4)System Verilog 父类与 ...

最新文章

  1. Python的sorted函数应用
  2. 【算法】有关点分治的一些理解与看法
  3. mysql创建管理密码_mysql 创建用户与授权、修改密码
  4. 定义jQuery插件
  5. SVD 与 PCA 的直观解释(4): PCA 主成分分析
  6. vscode css智能补全_让你编码嗨到停不下来的8个VSCode插件
  7. 网络通信--协议设计
  8. mysql 面试题 总结
  9. 八皇后问题(启发式搜索)
  10. 一个有用的webstrom激活方法
  11. 几张图片演示PD(PowerDesigner)生成数据库脚本sql文件
  12. QTableView如何设置表头宽度
  13. 微信小程序ocr身份证扫描
  14. 调查显示,41%的下一代家族企业接班人希望未来五年成为执行董事
  15. 电子产品销售分析练习项目
  16. SpringBoot 时间格式化的 5 种实现方法,你用的是哪种?
  17. 47个经典java程序编程题
  18. 扩散模型(Diffusion Model,DDPM,GLIDE,DALLE2,Stable Diffusion)
  19. ldar是什么意思 计算机组成,第一章TEC-9计算机组成和数字逻辑实验系统介绍….PDF...
  20. iOS AOP框架Aspects实现原理

热门文章

  1. css复杂的背景图案(网格、波点、棋盘)
  2. 数字黑洞6174(Kaprekar常数)之java演示
  3. 计算机考研复试机考难度,考研复试难还是初试难 都考什么
  4. 指令选择器调查(5)
  5. 用 C++ 可以开发的 7 件事 | 解释 C++ 的特点和学习的优点
  6. 计算机主机探秘,探秘linux-计算机基础
  7. 2020天猫双十一成交总额预计达到多少亿呢?
  8. 属于中端排位的一些小技巧,多看看没坏处哦。
  9. 普耐尔momo7w安装Linux,momo7w安装单系统安卓或双系统安卓+windows教程第七次修订版.doc...
  10. 2020/10/31模拟赛