2013-06-05 74 views
0

我必须使用迭代器在矢量中的特定位置上插入元素。 我不能使用insert()函数(我已经明确指示我应该在没有insert()的情况下执行它)。用迭代器插入到矢量中

这是我的代码(或至少其弄乱部分):

cerr << "distance before resize: " << distance(wl.begin(), pos) << endl; 
wl.resize(wl.size()+1); 
cerr << "distance after resize: " << distance(wl.begin(), pos) << endl; 
move_backward(pos, wl.end()-1, wl.end()); 
(*pos) = temp; 

我的输出:

distance before resize: 0 
distance after resize: -322 

所以apperantly,我调整大小弄乱迭代POS。有想法该怎么解决这个吗?

编辑:你可能想知道我是怎么声明我的迭代器:

auto pos = wl.begin(); 
+2

'resize'可能会重新分配'vector'的内存。你的'pos'指向原始内存中间的某个地方,它不再存在。相反,存储你想要的位置的指数,并使用它。 – BoBTFish

回答

0

调整大小无法保持迭代,因为调整操作可能迭代器指向无效的非常具体内容。

Stardard程序将检查您是否需要首先调整大小,并且在可选调整大小操作后,继续以任何您想要的方式插入新元素。

0

调整矢量大小会使其迭代器失效。在致电resize()后,pos不是有效的迭代器,应再次重新分配给wb.begin()

1

您可以结合std::vector::push_back在后面插入新元素,然后从<algorithm>开始std::rotate将最后一个元素旋转到所需的位置。

当然push_back不会保留迭代器,所以首先使用std::distance(v.begin(), it)(来自<iterator>)来确定所需位置的索引。

+0

'std :: rotate'是一个聪明的解决方案,但是你给了OP一个家庭作业的答案,而没有让他们考虑它:( –

+0

@RickYorgason:嗯,也许,但后来我没有得到报酬让人们想。 ..:-S(如果他们想要,他们可以去上学) –

0

这听起来像这个练习的目的是教你iterator invalidation,所以你应该问自己一个问题是“是否有任何相当于一个迭代器,得到无效?”