8

これはおそらく非常に初心者の質問です。私が取り組んでいるクラス (MyClass と呼びましょう) には、次の変数が含まれています。

 int nbins;
 double * bins; // = new double[nbins+i]

コピーコンストラクタを実装しているので

 MyClass( const MyClass& source )

をコピーする必要がありますsource.binsstd::copyfromを使用するつもりでしたalgorithmが、私が見つけたすべての例は、 のような静的配列double bins[] = ...または のような標準データ構造をコピーする方法を示していますstd::vectorstd::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) ?*/ );

だから、私の質問は基本的に2つです:

1)std::end(bins)の終わりがどこにあるか知っていますbins (=new double[nbins+1])か?

2) コピーを行う前にコピー先にメモリを割り当てる必要がありますか? または、copy(またはmemcpy)がそれを処理しますか?

4

1 に答える 1

15

1)std::end(bins)の終わりがどこにあるか知っていますbins (=new double[nbins+1])か?

いいえ、配列が固定サイズである必要がありますstd::beginstd::end

2) コピーを行う前にコピー先にメモリを割り当てる必要がありますか? または、コピー (または memcpy) がそれを処理しますか?

メモリを割り当てる必要があります。どちらもcopymemcpy書き込み可能なメモリ ブロックを提供することを前提としています。

はい、使用できますが、およびstd::copyなしで使用できます。std::beginstd::end

double * bins = new double[nbins+1]; //is this necessary?
std::copy( source.bins , source.bins + N, bins );

ここNで、 は長さ、または が指す配列source.binsです。明らかに、範囲外の配列にアクセスしていないことを確認する必要があります。

于 2013-10-29T16:52:27.750 に答える