2015-02-12 54 views
2

我使用C++ 11,我喜歡插入一個載體向另一個載體的特定位置,這裏是一個簡化的代碼:C++ 11插入一個載體導入特定位置

#include <vector> 
#include <iostream> 
#include <algorithm> 

using namespace std; 

int main() 
{ 
    vector<int> v1 = {1, 2, 3}; 

    vector<int> v2 = {0, 3, 9}; 

    vector<int>::iterator itr = find(v2.begin(), v2.end(), 3); 
    itr = v2.erase(itr); 

    // like to insert "3", "2" and "1" to the same position which ends up "1", "2" and "3" 
    for (auto ri = v1.rbegin(); ri != v1.rend(); ++ri) { 
     v2.insert(itr, *ri); 
    } 

    for (const auto &i : v2) { 
     cout << i << " "; 
    } 
    cout << endl; 

    return 0; 
} 

的上面的代碼崩潰。

是的,我知道像transform()或copy()這樣的其他STL API可能是一個可以使用的API,但只是想知道上面的代碼有什麼問題?

+0

http://www.cplusplus.com/reference/vector/vector/insert/請注意insert(...)函數是如何被重載的 - 您絕對可以將它轉換爲標準庫的一行代碼。 – druckermanly 2015-02-12 05:21:49

回答

2

您當前的代碼崩潰,因爲itr失效時insert()後重新分配v2超過其最大容量。

更改如下:

v2.insert(itr, *ri); 

itr = v2.insert(itr, *ri); 
2

使用此API

template <class InputIterator> void insert (iterator position, InputIterator first, InputIterator last);

所以你的情況,更換與第二環:

insert(itr,v2.begin(),v2.end())

+0

@TonyD不,它會變成「0 3 2 1 9」。 – songyuanyao 2015-02-12 05:48:36

+0

@songyuanyao:你是對的 - 我誤解了那裏的意圖......乾杯。 – 2015-02-12 05:56:54

2

什麼是錯的,上面的代碼嗎?

迭代器itrinsert後變爲無效,所以程序在for循環的第2次執行時崩潰。您可以使用返回值insert(指向插入值的迭代器)來獲取插入位置的有效迭代器。

變化

v2.insert(itr, *ri); 

itr = v2.insert(itr, *ri); 

insert導致重新分配,如果新的大小()是比舊容量大()。如果新大小()大於容量(),則所有迭代器和引用都將失效。否則,只有插入點之前的迭代器和引用保持有效。過去最終迭代器也失效。

參考:http://en.cppreference.com/w/cpp/container/vector/insert

PS:請參閱@錦的答案,這比在一般情況下手寫的循環更好的解決方案。