2

std::vectorデータを aからa に設定する最も効率的な方法は何std::valarrayですか? と がstd::valarray<double> my_valarray;ありstd::vector<double> my_vector;、データを から にコピーしたいとしmy_vectorますmy_valarray

オプション 1 (valarrayコンストラクターとコピー代入を使用):

my_valarray = std::valarray(my_vector.data(), my_vector.size());

オプション 2 (サイズ変更とコピー):

my_valarray.resize(my_vector.size());
std::copy(my_vector.begin(), my_vector.end(), std::begin(my_valarray));    

どちらの場合も、複雑さがO(2n)であるように見えるため、問題が発生します。最初のケースでは、データは構築中に一時的にコピーされvalarray(1 回の割り当て + データをコピーするための 1 回のパス)、最終オブジェクトへの割り当て時に (1 回の割り当て + データをコピーするための 1 回のパス) コピーされます。2 番目のケースでは、1 つの割り当て + すべての要素をゼロに初期化するための 1 つのパスと、データをコピーするための別のパスがあります。C++11 の移動セマンティクスは最初のケースに適用され、データをコピーするために 1 つの割り当てと 1 つのパスのみが必要になりますか?

4

2 に答える 2

3

はい、移動セマンティクスは最初のケースに適用されます。これstd::valarray(my_vector.data(), my_vector.size())は、右辺値であり、移動代入演算子がvalarrayクラスに対して定義されているためです( http://en.cppreference.com/w/cpp/numeric/valarray/operator%3D )。

于 2015-01-04T12:05:10.317 に答える
1

最初のオプションはより効率的です。その理由は、std::valarray::resizeすべてのデータをゼロで初期化するためです。しかし、それが価値のあるコンパイラは、その冗長なゼロ初期化を最適化すると思います。

vector から valarray へのコピーを防ぐことはできません。メモリ ブロックの所有権を my_vector から my_valarray に移す方法はありません。

于 2015-01-04T15:36:53.283 に答える