53

一定サイズの配列の内容をコピーしたいと思うことがよくあります。通常は、次の行に沿って何かを書くだけです。

float a[4] = {0,1,2,3};
float b[4];

for(int i=0; i<4; i++){
    b[i]=a[i];
}

最近、私は教育目的で線形微積分ライブラリを作成していますが、それを行うためのより良い方法があるかどうか疑問に思っていました。

最初に頭に浮かんだのは、memcpy を使用することでした。

memcpy(b, a, sizeof(float) * 4);

しかし、これは非常にCに似ており、エラーが発生しやすいようです。私はコンパイル時にエラーが発生するのが好きです。これは、自明でないコピー コンストラクターを使用したデータ型の場合や、sizeof(datatype) で乗算するのを忘れた場合に醜くなる可能性があります。

集中的に使用する数学ライブラリを作成しているので、パフォーマンスは私にとって非常に重要です。今日のコンパイラは、最初の例が単にメモリのチャンクをコピーし、それを最適化して 2 番目のソリューションと同じくらい効率的であることを理解できるほど賢いでしょうか?

おそらく、標準ライブラリに私を助けることができる関数がありますか? C ++ 11で何か新しいことはありますか? それとも、マクロまたはテンプレート関数を作成する必要がありますか?

4

5 に答える 5

80

組み込みの配列の代わりに使用std::arrayすると(そうするべきです)、非常に簡単になります。配列をコピーすることは、他のオブジェクトをコピーすることと同じです。

std::array<float,4> a = {0,1,2,3};
std::array<float,4> b = a;
于 2012-09-08T05:41:51.857 に答える
54

C++03 のやり方

使用std::copy():

float a[4] = {0,1,2,3};
float b[4];

std::copy(a,a + 4, b);

それはそれが得られるのと同じくらいきれいです。

C++11 の方法

std::copy(std::begin(a), std::end(a), std::begin(b));

std::array を使用できる場合

簡単な割り当てをstd::array行うだけです。

std::array<float,4> a = {0,1,2,3};
auto b = a;
于 2012-09-08T05:39:01.207 に答える
21

C++03 (および C) ソリューションに関心がある場合 - 配列のみではなく、常に配列を含む構造体を使用します。

struct s { float arr[5]; };

構造体はデフォルトでコピー可能です。

C++11 での同等物は、既に述べたように、std::array<float,5>;

于 2012-09-08T10:22:04.930 に答える
4

以下の方法は、通常の配列でも std:array に対しても機能します。

float a[4] = {0,1,2,3};
float b[4];

std::copy(std::begin(a), std::end(a), b);
于 2017-08-30T11:25:18.720 に答える
2
#include <algorithm>
std::copy_n(a, 4, b)
于 2012-09-08T07:22:21.563 に答える