这可能是一个非常新手的问题。我正在处理的类(我们称之为MyClass)包含以下变量
int nbins;
double * bins; // = new double[nbins+i]
因为我正在实现一个复制构造函数
MyClass( const MyClass& source )
我需要复制source.bins
。我将使用std::copy
中的algorithm
,但我发现的所有示例都展示了如何复制像double bins[] = ...
这样的静态数组或像std::vector
这样的标准数据结构。我找不到像std::copy
这样的指针使用double * bins = new double[nbins+i]
的任何示例。所以,我的问题是:在指针上使用std::copy
是合法的,例如
double * bins = new double[nbins+1]; //is this necessary?
std::copy( std::begin( source.bins ), std::end(source.bins), std::begin(bins) );
或者我应该更依赖C memcpy
double * bins = new double[nbins+1]; //again, is this necessary?
memcpy( source.bins, bins, (nbins+1) /* *sizeof(double) ?*/ );
所以,我的问题基本上是两个:
1)std::end(bins)
知道bins (=new double[nbins+1])
的结尾在哪里吗?
2)在复制之前,我是否需要为目的地分配内存?或copy
(或memcpy
)负责照顾?
答案 0 :(得分:12)
1)
std::end(bins)
知道bins (=new double[nbins+1])
的结尾在哪里吗?
不,std::begin
和std::end
要求数组具有固定大小。
2)在复制之前,我是否需要为目的地分配内存?或者副本(或memcpy)处理这个?
您需要分配内存。 copy
和memcpy
都假设您为它们提供了可写入的内存块。
是的,你可以使用std::copy
,但没有std::begin
和std::end
:
double * bins = new double[nbins+1]; //is this necessary?
std::copy( source.bins , source.bins + N, bins );
其中N
是source.bins
指向的长度或数组。显然你必须确保你没有访问任何数组越界。