web-dev-qa-db-ja.com

C ++ 11で定数サイズの配列をコピーする最もクリーンな方法

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

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の新機能または、マクロまたはテンプレート関数を作成するだけですか?

38
bobbaluba

組み込み配列の代わりにstd::arrayを使用する場合(これを使用する必要があります)、非常に単純になります。配列のコピーは、他のオブジェクトのコピーと同じです。

std::array<float,4> a = {0,1,2,3};
std::array<float,4> b = a;
60

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<float,4> a = {0,1,2,3};
auto b = a;
43
Mysticial

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

struct s { float arr[5]; };

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

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

16
PiotrNycz
#include <algorithm>
std::copy_n(a, 4, b)
2
hjbabs

以下のメソッドは、std:arrayと同様に通常の配列でも機能します。

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

std::copy(std::begin(a), std::end(a), b);
0
Shital Shah