c ++ 11将向量插入特定位置

时间:2015-02-12 05:19:02

标签: c++

我使用的是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;
}

上面的代码崩溃了。

是的,我知道其他一些STL API如transform()或copy()可能是要使用的,但只是想知道上面的代码有什么问题?

3 个答案:

答案 0 :(得分:2)

使用此API

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

所以在你的情况下,用:

替换第二个循环

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

答案 1 :(得分:2)

itr insert()v2超出其最大容量后重新分配v2.insert(itr, *ri); 时,您的当前代码崩溃了。

更改以下内容:

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

{{1}}

答案 2 :(得分:2)

  

上述代码有什么问题?

迭代器itrinsert之后变为无效,因此程序在for循环的第二次执行时崩溃。您可以使用insert的返回值(指向插入值的迭代器)来获取插入位置的有效迭代器。

更改

v2.insert(itr, *ri);

itr = v2.insert(itr, *ri);
如果新size()大于旧容量(),则

insert会导致重新分配。如果new size()大于capacity(),则所有迭代器和引用都将失效。否则,只有插入点之前的迭代器和引用仍然有效。过去的迭代器也会失效。

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

PS:请参阅@Kim的答案,在一般情况下,它比手写循环更好。