3

Accelerated C ++を読んでいますが、以下に投稿された質問についていくつかの提案が必要です。

  1. このコードは何をしますか?

    vector<int>u(10,100)    
    vector<int>v;    
    copy(u.begin(), u.end(), v.end());
    
  2. プログラムを修正するための2つの可能な方法を提供し、その長所と短所をリストします。

最初の部分はかなり単純でしたが、2番目の部分で助けが必要です。私は3つのアプローチを提供しましたが、これ以上可能な解決策があるかどうか疑問に思っています。

また、自分のアプローチの長所と短所がわかりません。やってみましたので、ご意見をお聞かせください。


copy()

std::vector<int> u(10, 100);
std::vector<int> v;
std::vector<int> w ;
std::vector<int> x ;
std::copy(u.begin(), u.end(), back_inserter(v)); // 1st way of doing

利点

  • std::copy()イテレータの値は変更されません
  • のパラメータはstd::copy()特定のコンテナに依存しないため、コードは別のコンテナで再利用できます

短所

  • std::back_inserter()シーケンシャルコンテナでのみ機能するため、マップでは使用できません
  • の3番目のパラメーターに間違ったイテレーター値を割り当ててもstd::copy()、コンパイラー・エラーは発生しませんが、プログラムの動作が異なる場合があります。

insert()

w.insert(w.end(), u.begin(), u.end() );

利点

  • insert()ほとんどのコンテナで使用できます

短所

何も考えられない。


push_back()

for ( std::vector<int>::const_iterator it = w.begin(); it != w.end(); ++it )
{
    x.push_back( *it );
}

利点

カントは何でも考えます。

短所

  • std::copy()またはに比べて遅いvector::insert()

私のアプローチは正しいですか?他にどのような解決策がありますか?

4

2 に答える 2

5

あなたのタイトルはあなたがベクトルをコピーすることに興味があることを示唆していますが、あなたのコードはあなたがベクトルに挿入することに興味があることを示唆しています(その名前にもかかわらずstd::copyここでの挿入に使用されることに注意してください)。

コピーしたい場合:

// This requires the vector types to match exactly
std::vector<int> v = u;

// In case the vector differ in their value_type
// This requires that the value_type of the source be
// convertible to the value_type of the destination
std::vector<int> v(u.begin(), u.end());

挿入する場合は、説明する両方の方法(std::copyプラスイテレーターアダプターを使用するか、insertメンバーを呼び出す)が適切です。コードの特定の場所でコンテナーを使用しているか、イテレーターを使用しているかに応じて、1つを選択する必要があります。(イテレーターを使用する場合、イテレーターアダプターを使用する負担はイテレーターを通過するクライアントにかかるため、心配する必要はありませんpush_back。)イテレーターだけの場合、egを呼び出すことinsertは単にオプションではありません。あなたがコンテナを持っていて、メンバーの一人が仕事をすることができるなら、それを自由に使ってください。ただし、アルゴリズムを使用する場合のエラーは考慮しません。

最後の手段として、明示的なループを残してください。

于 2012-08-31T16:51:15.593 に答える
0

私には、著者は std::copy() を引き続き使用する必要があることを意味しているようです。したがって、最初の解決策は(あなたが提案したように):

std::copy(u.begin(), u.end(), back_inserter(v));

もう1つは次のとおりです。

v.resize(u.size());
std::copy( u.begin(), u.end(), v.begin() );
于 2013-12-22T01:19:53.930 に答える