3

大きなマルチレベル ベクトルがあるとします。(これは、複数レベルの包含オブジェクト ツリーの単なる例です)

vector<vector<vector<int>>> vec1 = getBigVector();

要素を渡す必要がある場合は、一種のコピーが発生すると思います。

vector<vector<int>> vec2 = vec1[2];
vector<vector<int>> vec3 = vec1[3];

参照するよりも効率的に見えません。私の知る限り、C++ は通常その効率性のために選択され、C++ は値型オブジェクトを優先するように設計されていると聞きました。しかし、それは多くの要素を持つコンテナにも当てはまりますか? コンテナに別のコンテナが含まれているのはどうですか?

作業を効率化する秘密はありますか? または、コピーする代わりに参照する必要がありますか?

アップデート

オブジェクト ツリー全体を頻繁に変更する必要があります。さらに、ツリー自体を変異させる必要があります。

4

1 に答える 1

3

一般に、はい、コピーの代わりに参照を使用してください。オブジェクト全体をコピーする必要がない場合(参照でもコピーできる場合) は、参照を使用します。

ただし、既存のオブジェクトを移動または名前変更したい場合もあります。そのような場合、std::move関数 (C++11 の新機能) を使用できます。これは基本的に、新しいオブジェクトをより速く作成するのに役立つ場合は、古いオブジェクトをジャンクしても問題ないことを STL に伝えます。

例:

vector<vector<int>> vec2 = vec1[2];

は、「まったく新しいオブジェクトを作成するため、2 つのオブジェクトが存在する」ことを意味します。これは非常に遅いです。

vector<vector<int>> &vec2 = vec1[2];

「オブジェクトはまだ 1 つしかありませんが、それへの参照が 2 つある」ことを意味します。これが最速のオプションです。

vector<vector<int>> vec2 = std::move(vec1[2]);  // C++11

は「2 つのオブジェクトがありますがvec2、 の内部を盗んだvec1[2]のでvec1[2]、空の殻です」という意味です。もちろん、参照を作成するほど速くはありませんが、これも通常は非常に高速な操作です。vec1[2]終了した後に何かをしようとするのはエラーstd::moveです。合法的にできる唯一のことは、そのデストラクタを呼び出すことです。

C++11 のstd::move、Google の「右辺値参照」の詳細については。

于 2013-03-02T08:32:27.727 に答える