我使用的是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()可能是要使用的,但只是想知道上面的代码有什么问题?
答案 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)
上述代码有什么问题?
迭代器itr
在insert
之后变为无效,因此程序在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的答案,在一般情况下,它比手写循环更好。