C++ 风格的复制操作

使用STL中的copy算法

int a[] = {1,2,3,4,5};
int b[5];
std::copy(std::begin(a),std::end(a),std::begin(b));
for(auto e:b) cout<<e<<" "; // 输出 1,2,3,4,5

上述程序中,copy算法将数组a区间中的数复制到以begin(b)开始的区间中去.

使用array容器 (C++11)

std::array<int,5> arr = {1,2,3,4,5};
std::array<int,5> copy;
copy = arr; // 将arr中的元素复制到copy中
arr[0] = 100;
for(auto e:copy) cout<<e<<" "; //输出 1,2,3,4,5

C 风格的复制操作

使用memcpy()

int arr[] = {1,2,3,4,5};
int copy[5];
int len = sizeof(arr) / sizeof(arr[0]);
memcpy(copy,arr,len*sizeof(int)); // 输出 1,2,3,4,5
for(auto e:copy) cout<<e<<" ";

注意:memcpy()函数的第三个参数表示的是要复制的字节数,而不是要复制的元素数目。至于这样做的原因,可以先来看memcpy()的原型:

void* memcpy(void* destination,const void* source,size_t num);

由memcpy()的函数原型可以看到,该函数的前两个参数的类型是void*类型,这样做是为了使memcpy()可以作用于任何类型的指针。

但这样做又导致了一个问题,即memcpy()不知道传入数组的每个元素用多少字节来表示。也正是因为这个原因,使得memcpy()的第三个参数不能是要复制的元素个数,而是要复制的字节数。

使用memmove()

该函数与memcpy()类似,只是memmove允许目的位置和源位置重叠,示例如下:

int arr[] = {1,2,3,4,5,6,7,8};
memmove(arr+3,arr+1,sizeof(int)*5);
for(auto e:arr) cout<<e<<" "; // 输出 1,2,3,2,3,4,5,6

注意:上面的程序中,如果将memmove()换作memcpy()可能也会正常工作,但是这种行为是不可预计的,当目的位置与源位置存在重叠时,应当使用memmove()。

测试实例

#include <iostream>

using namespace std;
int main()
{
int a[] = { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10 };
int b[10] = { 0 };
int c[10] = { 0 };
//copy
copy(begin(a), end(a), begin(b));
for (auto i : b)
cout << i << " ";
cout << endl;
//memcpy
memcpy(c, a, sizeof(a));
for (auto i : c)
cout << i << " ";
cout << endl;
//memmove
int arr[] = { 1, 2, 3, 4, 5, 6, 7, 8 };
memmove(arr + 3, arr + 1, sizeof(int)* 5);
for (auto e : arr)
cout << e << " ";
cout << endl;
system("pause");
return 0;
}

运行结果:

转自:https://www.techforgeek.info/how_to_copy_array.html

C++对数组进行复制的更多相关文章

  1. js对象/数组深度复制

    今天碰到个问题,js对象.数组深度复制:之前有见过类似的,不过没有实现函数复制,今晚想了一下,实现代码如下: function clone(obj) { var a; if(obj instanceo ...

  2. Java数组的复制

    初学Java的时候,需要复制数组的时候,一下子就想到使用赋值语句“=”,例如:array1 = array2:但后来慢慢发现,这个语句并不能将array2的内容复制给array1,而是将array2的 ...

  3. C语言 memcpy二维数组的复制

    今天在实现二维数组的复制功能时,竟然出现了好多问题,还是太不小心了. 我们知道,平时进行矩阵复制,无非是二重循环进行赋值操作,所以今天想改用利用memcpy进行复制操作,当然一维数组的复制在上一篇文章 ...

  4. Java开发之Java对数组的复制

    苏格拉底曾说过,“世界上最快乐的事,莫过于为理想而奋斗.”人生短短数十年,何不为梦想而奋斗一把?其实只要主动追求,梦想并不遥远.总有一天,你会把它攥在手里. 作为写的第一篇Java文章,展望一下开始下 ...

  5. JAVA二维数组的复制

    JAVA二维数组的复制 笔者今天做一道ccf题目时,遇到要将二维数组拷贝复制时,没有用常规的那种一个一个数的复制,用的是System.arraycopy()来进行复制,下面介绍这个函数的一些注意点: ...

  6. 数组的复制及ES6数组的扩展

    一.数组的复制 // alert([1,2,3]==[1,2,3]); let cc = [0,1,2]; let dd = cc; alert(dd==cc);//此时改变dd会影响cc ES5 只 ...

  7. Java数组的复制全解

    1.将一个基本数据类型数组的引用赋值给另一个数组 public class Array_copy { int[] array1=new int[]{1,2,3,4,5,6}; int[] array2 ...

  8. Arrays类的运用,二分法,数组的复制,命令行参数的运用,二维数组,Object,equals

    /*Arrays jdk中为了便于开发,给开发者提供了Arrays类, 其中包含了很多数组的常用操作.例如快速输出.排序.查找等.*/ import java.util.Arrays; public ...

  9. C++数组怎么复制

    C++数组怎么复制: #include <string.h>main(){int a[10]={34,56,4,10,77,51,93,30,5,52};int b[10];memcpy( ...

  10. java中数组的复制

    数组复制使我们在编程过程中经常要使用到的,在java中数组复制我们大概能够分为两种,一种是引用复制,还有一种就是深度复制(复制后两个数组互不相干). 以下我们就通过測试的方法来具体看看什么是引用复制和 ...

随机推荐

  1. linux文件软链接与硬链接

    1.命令格式: ln [参数][源文件或目录][目标文件或目录] 软链接只会在你选定的位置上生成一个文件的镜像,不会占用磁盘空间. 2.命令功能: Linux文件系统中,有所谓的链接(link),我们 ...

  2. 87.QuerySet API使用详解:create方法

    create:创建一条数据,并且保存到数据库中,这个方法相当于先用指定的模型创建一个一个对象,然后再调用这个对象的save方法,示例代码如下: from django.db import connec ...

  3. Serverless 公司的远程团队沟通策略

    本文系译文,Serverless 团队分散在全球各地,本文介绍我们如何管理沟通策略和远程协作. 原作者:FelixDesroches 译者:Aceyclee 首先向不了解我们的人说明一下,Server ...

  4. linux虚拟机安装oracle全过程(一)

    起源:为方便系统迁移,导致的不必要的重装软件.故在虚拟机中搭建oracle数据库以及weblogic服务器(所有使用软件及资源链接附在结尾处) 1.安装虚拟机: 1.1.安装vmware 11破解版. ...

  5. jquery判断字符串中是否包含特定字符的方法总结

    方法一:使用indexOf() 和lastIndexOf()方法 案例: var Cts = "bblText"; if(Cts.indexOf("Text") ...

  6. 3.redis认证

    redis认证方法 1.redis.conf requirepass PASSWORD 2.redis-cli auth PASSWORD redis清空数据库 flushdb //清空当前数据库 f ...

  7. 吴裕雄--天生自然 JAVA开发学习:正则表达式

    import java.util.regex.*; class RegexExample1{ public static void main(String args[]){ String conten ...

  8. webgis笔记

    3.8(02) .特点:由服务端进行数据管理 开源的GO sever WMS/WCS/WTS 1sever/2engine/3database/4standard 扩展的空间数据库,存矢量.栅格.直接 ...

  9. JavaScript mixins

    mixin 是一个类,该类的方法被添加,混合进另外一个类.一个基础类会包含mixin类的方法而不是继承它.这样你就可以使用不同的mixin类来增加或者增强基础类的功能. 这编内容包含怎么样使用java ...

  10. ILSVRC2012下载

    http://www.image-net.org/challenges/LSVRC/2012/nnoupb/ILSVRC2012_img_test.tarhttp://www.image-net.or ...