linux c 数组拷贝,C++对数组进行复制 - osc_8iux0cyz的个人空间 - OSCHINA - 中文开源技术交流社区...

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<

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

使用array容器 (C++11)

std::array arr = {1,2,3,4,5};

std::array copy;

copy = arr; // 将arr中的元素复制到copy中

arr[0] = 100;

for(auto e:copy) cout<

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<

注意: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<

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

测试实例

#include

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;

}

运行结果:

af1c66d5be2049686ca35b534d56f0b7.png

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值