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 :(得分:9)
您的代码具有未定义的行为,因为您分配的是处于或超出结尾的迭代器。 reserve()函数不会更新大小,只更新容量。您可以尝试调整resize()。
答案 1 :(得分: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);