2013-07-31 110 views
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打印4 5,當我預計它將打印1 2 3 4 5 1 2 3 4 5? 問題2,當我用copy(vi.begin(), vi.end(), back_insert(vi))替換它時,它會打印4 5 4 5,爲什麼?迭代器不訪問全矢量

+0

什麼是 「__1」 嗎? –

+0

我不知道,這是編譯器自動添加的,我用的ide是xcode 4.6.2; –

回答

9

您的代碼具有未定義的行爲,因爲您分配給了位於或超出結尾的迭代器。 reserve()函數不更新大小,僅更新容量。您可以嘗試調整大小()。

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);