1
int main()
{
    vector<int> vi;

    vi.reserve(10);
   // back_insert_iterator<vector<int> > iter(vi);

    vector<int>::iterator iter = vi.begin();

    *iter = 1;
    ++iter;
    *iter = 2;
    ++iter;
    *iter = 3;

    back_insert_iterator<std::__1::vector<int> > iterb(vi);
    back_inserter(vi) = 4;
    back_inserter(vi) = 5;

    vi.reserve(vi.size() * 2);
    copy(vi.begin(), vi.end(), vi.end());

    ostream_iterator<int> os(cout, " ");
    copy(vi.begin(), vi.end(), os);
}

質問 1、印刷されると思っていたのに、なぜcout印刷されるのですか? 質問 2、 に置き換えるとが出力されますが、なぜですか?4 51 2 3 4 5 1 2 3 4 5copy(vi.begin(), vi.end(), back_insert(vi))4 5 4 5

4

2 に答える 2

9

最後またはそれ以降の反復子に割り当てるため、コードの動作は未定義です。reserve() 関数はサイズを更新せず、容量のみを更新します。代わりに resize() を試すことができます。

于 2013-07-31T02:03:44.127 に答える
3

copy(vi.begin(),vi.end(),vi.end())std::copy宛先イテレータに書き込み、終了イテレータに書き込むことができないため、 機能しません。

copy(vi.begin(),vi.end(),back_insert(vi))back_insert_iteratorは、挿入時にベクトルを変更し、ソース イテレータを無効にするため、機能しません。

代わりにこれを試すことができます:

 size_t vi_size = vi.size();
 vi.resize(vi_size*2);
 copy(vi.begin(),vi.begin()+vi_size,vi.begin()+vi_size);
于 2013-07-31T02:10:51.827 に答える