3

あるベクトルを別のベクトルに割り当てるには、(私が知っている) 2 つの方法があります。

std::vector<std:string> vectorOne, vectorTwo;
// fill vectorOne with strings

// First assign method
vectorTwo = vectorOne;

// Second assign method
vectorTwo.assign( vectorOne.begin(), vectorOne.end() );

これらの方法には本当に違いがありますか、それとも非常に大きなベクターで実行した場合の効率と安全性の点で同等ですか?

4

3 に答える 3

7

それらはほとんど同等です。2 番目の理由は、(暗黙的な) 変換が必要な型がある可能性があるためです。

std::vector<int> vi;
std::vector<double> vd;
//  ...
vd.assign( vi.begin(), vi.end() );

または、コンテナーのタイプが異なる場合があります。

vd.assign( std::istream_iterator<double>( file ),
           std::istream_iterator<double>() );

両方のコンテナが同じタイプであることがわかっている場合は、割り当てを使用してください。ソースへの参照を 1 つしか使用しないという利点があり、C++11 でムーブ セマンティクスを使用できる可能性があります。

于 2013-08-28T16:03:25.097 に答える
1

この場合、それらは同等です。[および C++03 標準]。ただし、 vectorTwo に代入前の要素が含まれている場合は異なります。それで

vectorTwo = vectorOne; // use operator=
// Any elements held in the container before the call 
// are either assigned to or destroyed.

vectorTwo.assign() // any elements held in the container
// before the call are destroyed and replaced by newly 
// constructed elements (no assignments of elements take place).

assignは、operator=単一の右側オペランドを取るassignため、デフォルトの引数値または値の範囲が必要な場合に使用されるため、必要です。最初に適切なベクトルを作成し、次にそれを割り当てることにより、間接的に何assignができるでしょうか。

void f(vector<Book>& v, list<Book>& l){
    vector<Book> vt = (l.begin(), l.end());
    v = vt;
}

ただし、これは見苦しく非効率的です (例は Bjarne Stroustrup "The C++..." から引用されています)。

assignまた、 vector が同じ型でない場合は、暗黙的な変換を許可する whichも必要であることに注意してください。

vector<int> vi;
vector<double> vd;
//  ...
vd.assign( vi.begin(), vi.end() );
于 2013-08-28T16:07:46.673 に答える