web-dev-qa-db-ja.com

STLのリストにベクターをコピーする最良の方法は?

イテレーターを使用してベクトルを反復処理し、リストにコピーするのが最も最適なコピー方法です。何かお勧めですか?

41
kal

なぜ反復し、標準のコピーアルゴリズムを使用しないのですか?

std::copy( vector.begin(), vector.end(), std::back_inserter( list ) );
86
Kasprzol

新しいリストを作成する場合は、開始反復子と終了反復子を使用するコンストラクターを利用できます。

std::list<SomeType> myList(v.begin(), v.end());

追加する既存のリストがある場合、Kasprzolの答えは完璧です。

61
Fred Larson
list.assign(vector.begin(), vector.end());
6
Dennis

新しいリストを作成するためのこの提案が好きです。

std::list<SomeType> myList(v.begin(), v.end());

ただし、既存のリストに追加する場合、小規模なデータセットには以下が最適な場合があります。 「最適」とは、実行する方法を覚えるのが最も簡単で、理解するのが最も簡単であることを意味します。 (これらは主観的な発言ですが、あなたの脳がどのように配線されているかによります)

for ( unsigned i=0; i<v.size(); i++ ) myList.Push_back(v[i]);

ベクトルでイテレータを使用すると、多くの場合、非常に面倒になることがあります。通常、単純なインデックス付けは問題なく機能します。

別のスレッドは、イテレータとインデックス( ここ )を扱います。そのスレッドでは、取られた回答は基本的に反復子がより一般的であるため、基本的に優先されます。しかし、ベクトルが最も一般的に使用されるコンテナータイプである場合、この種の単純なアルゴリズムを特化することは妥当だと思います。

1
nobar

<algorithm>ヘッダーからより複雑なもの、たとえばfor_eachまたはcopy ...を使用することもできますが、私の意見では同じものになります。

0
ChrisW