我无法为这个问题找到更好的标题,如果需要,请根据以下问题更新它。
考虑一个迭代器 - iter
,指向 a 中的元素std::vector<int>
。我*iter
使用以下方法在当前迭代器位置插入值:
iter = target.insert(iter, *iter);
我知道这insert
会将迭代器返回到新插入的元素。现在我把上面的语句改成:
iter = target.insert(iter, *iter++);
我知道这会表现得很尴尬,并导致Segmentation fault。我无法理解的是,如何评估上述作业?iter
我的意思是,在该分配之后将指向哪个元素。据我了解,由于我使用了后增量运算符,它的行为方式应该与第一条语句类似,我从下面的示例分配中推断出:
i = i++;
由于上述赋值不会影响 的值i
,因此在 的情况下也应如此*iter++
。
幕后的实际行为是什么?
这是真正的代码:
std::vector<int>::iterator begin = target.begin();
while (begin != target.end()) {
if (*begin % 2 == 0) {
begin = target.erase(begin);
} else {
begin = target.insert(begin, *begin); // I changed this line
begin += 2;
}
}
基本上上面的代码是从向量中删除偶数元素,并复制奇数元素。
编辑:
好的,如果我将第二行更改为++begin
,除了之前的更改 - 它的工作方式与当前代码相同。所以,我else
用这些行替换了块中的两行:
begin = target.insert(begin, *begin++);
++begin;
因此,似乎它分配的迭代器比前一种情况要快。
所以,这就是我从这种行为中理解的:
*begin++
首先取消引用begin
以获取当前位置的值。begin
是后递增的- 现在
insert
在后增量之后的迭代器之前插入取消引用的值。因此,它不是在原始 . 之前插入begin
,而是在 . 之前插入++begin
。然后返回值++begin
,它插入的位置。
我是否正确解释了它?