我是一名学习C / C ++的Java程序员。所以我知道Java具有类似System.arraycopy();的功能。复制数组。我想知道在C或C ++中是否有一个函数可以复制数组。我只能通过使用for循环,指针等来找到复制数组的实现。有可以用来复制数组的函数吗?
memcpy
,用std::copy
。如果您的类型具有有意义的副本构造函数,则将memcpy
做错事情。
我是一名学习C / C ++的Java程序员。所以我知道Java具有类似System.arraycopy();的功能。复制数组。我想知道在C或C ++中是否有一个函数可以复制数组。我只能通过使用for循环,指针等来找到复制数组的实现。有可以用来复制数组的函数吗?
memcpy
,用std::copy
。如果您的类型具有有意义的副本构造函数,则将memcpy
做错事情。
Answers:
从C ++ 11开始,您可以直接使用复制数组std::array
:
std::array<int,4> A = {10,20,30,40};
std::array<int,4> B = A; //copy array A into array B
这是关于std :: array的文档
B = A
。
由于您要求使用C ++解决方案...
#include <algorithm>
#include <iterator>
const int arr_size = 10;
some_type src[arr_size];
// ...
some_type dest[arr_size];
std::copy(std::begin(src), std::end(src), std::begin(dest));
<iterator>
<algorithm>
吗?
正如其他人提到的,在C中,您将使用memcpy
。但是请注意,这会进行原始内存复制,因此,如果您的数据结构具有指向自身或彼此的指针,则副本中的指针仍将指向原始对象。
在C ++中,你也可以使用memcpy
,如果你的数组成员是POD(即你也可能用于在C不变,基本类型),但在一般情况下,memcpy
将不会被允许。正如其他人提到的,要使用的函数是std::copy
。
话虽如此,在C ++中,您很少应该使用原始数组。相反,您应该使用标准容器之一(std::vector
是最接近内置阵列,也是我认为最接近Java数组-比普通的C接近++阵列,确实是- ,但std::deque
还是std::list
可以在某些情况下更合适)或者,如果您使用的是C ++ 11,std::array
它与内置数组非常接近,但是具有类似于其他C ++类型的值语义。我在这里提到的所有类型都可以通过赋值或复制构造来复制。此外,您可以使用迭代器语法从opne“交叉复制”到另一个(甚至从内置数组)。
这给出了可能性的概述(我假设已经包括了所有相关的标头):
int main()
{
// This works in C and C++
int a[] = { 1, 2, 3, 4 };
int b[4];
memcpy(b, a, 4*sizeof(int)); // int is a POD
// This is the preferred method to copy raw arrays in C++ and works with all types that can be copied:
std::copy(a, a+4, b);
// In C++11, you can also use this:
std::copy(std::begin(a), std::end(a), std::begin(b));
// use of vectors
std::vector<int> va(a, a+4); // copies the content of a into the vector
std::vector<int> vb = va; // vb is a copy of va
// this initialization is only valid in C++11:
std::vector<int> vc { 5, 6, 7, 8 }; // note: no equal sign!
// assign vc to vb (valid in all standardized versions of C++)
vb = vc;
//alternative assignment, works also if both container types are different
vb.assign(vc.begin(), vc.end());
std::vector<int> vd; // an *empty* vector
// you also can use std::copy with vectors
// Since vd is empty, we need a `back_inserter`, to create new elements:
std::copy(va.begin(), va.end(), std::back_inserter(vd));
// copy from array a to vector vd:
// now vd already contains four elements, so this new copy doesn't need to
// create elements, we just overwrite the existing ones.
std::copy(a, a+4, vd.begin());
// C++11 only: Define a `std::array`:
std::array<int, 4> sa = { 9, 10, 11, 12 };
// create a copy:
std::array<int, 4> sb = sa;
// assign the array:
sb = sa;
}
memcpy
示例中的唯一错误;大小也错了。我已经解决了,谢谢。
std:array
比like更像std::vector
,因为它具有固定的大小。
您可以使用memcpy()
,
void * memcpy ( void * destination, const void * source, size_t num );
memcpy()
将num
字节值source
直接从指向的位置复制到指向的存储块destination
。
如果destination
和source
重叠,则可以使用memmove()
。
void * memmove ( void * destination, const void * source, size_t num );
memmove()
将num
字节的值从指向的位置复制到指向source
的存储块destination
。复制就像使用中间缓冲区一样进行,从而允许目标和源重叠。
memcpy
错误的情况,即复制字节不足。
我喜欢Ed S.的答案,但这仅适用于固定大小的数组,不适用于将数组定义为指针的情况。
因此,C ++解决方案将数组定义为指针:
#include<algorithm>
...
const int bufferSize = 10;
char* origArray, newArray;
std::copy(origArray, origArray + bufferSize, newArray);
注意:无需扣除buffersize
1:
- 从第一个开始复制并复制到最后一个-1范围内的所有元素
在C ++ 11中,您可以将Copy()
其用于std容器
template <typename Container1, typename Container2>
auto Copy(Container1& c1, Container2& c2)
-> decltype(c2.begin())
{
auto it1 = std::begin(c1);
auto it2 = std::begin(c2);
while (it1 != std::end(c1)) {
*it2++ = *it1++;
}
return it2;
}
std::end
出于性能原因(退出循环期间c1不会更改或使迭代器无效,因此不必重新计算结束),退出循环是一个更好的主意。
我在这里给出了两种应对数组的方法,适用于C和C ++语言。memcpy和copy都可以在C ++上使用,但copy不适用于C,如果要在C中复制数组,则必须使用memcpy。
#include <stdio.h>
#include <iostream>
#include <algorithm> // for using copy (library function)
#include <string.h> // for using memcpy (library function)
int main(){
int arr[] = {1, 1, 2, 2, 3, 3};
int brr[100];
int len = sizeof(arr)/sizeof(*arr); // finding size of arr (array)
std:: copy(arr, arr+len, brr); // which will work on C++ only (you have to use #include <algorithm>
memcpy(brr, arr, len*(sizeof(int))); // which will work on both C and C++
for(int i=0; i<len; i++){ // Printing brr (array).
std:: cout << brr[i] << " ";
}
return 0;
}
using namespace std;
这是不好的做法。永远不要使用它。请使用cppreference.com而不是cplusplus.com,它包含了更好的标准文档。stdio.h
C ++中的等效项是cstdio
,请改用。此外,该代码是相当惯用的C ++。我认为如果您展示了针对C和C ++的单独解决方案,那将会更加清楚。
只需在代码中包含标准库即可。
#include<algorithm>
数组大小将表示为 n
你的旧数组
int oldArray[n]={10,20,30,40,50};
声明新数组,您必须在其中复制旧数组值
int newArray[n];
用这个
copy_n(oldArray,n,newArray);
首先,由于要切换到C ++,建议使用vector代替传统的array。此外,要复制数组或向量,std::copy
是您的最佳选择。
访问此页面以获取如何使用复制功能: http //en.cppreference.com/w/cpp/algorithm/copy
例:
std::vector<int> source_vector;
source_vector.push_back(1);
source_vector.push_back(2);
source_vector.push_back(3);
std::vector<int> dest_vector(source_vector.size());
std::copy(source_vector.begin(), source_vector.end(), dest_vector.begin());
man memmove
和man memcpy