2

下面的一段 c++ 代码给出了

int main()
{
    vector <int> myvect(3,0);
    vector <int> :: iterator it;
    it = myvect.begin();
    myvect.insert(it,200);
    myvect.insert(it+5,400);         //Not sure what 5 makes the difference here
    cout << myvect[0] << endl << myvect[1];
}

输出 :

200
400

相同的代码稍作改动

int main()
{
    vector <int> myvect(3,0);
    vector <int> :: iterator it;
    it = myvect.begin();
    myvect.insert(it,200);
    myvect.insert(it+4,400);         //Not sure what 4 makes the difference here
    cout << myvect[0] << endl << myvect[1];
}

输出:

400
200

有人能告诉我为什么向迭代器添加 4 或 5 会改变元素的顺序吗?

谢谢

4

2 回答 2

7

你的程序有未定义的行为

您正在创建一个由 3 个元素组成的向量(全部初始化为 0),并且在 position 处插入元素v.begin() + 5,该位置超出了向量的末尾。

此外,您正在使用迭代器 (在位置指向之前it)插入元素之后。根据 C++11 标准的第 23.3.6.5/1 段:it

[...] 如果没有发生重新分配,则插入点之前的所有迭代器和引用仍然有效。[...]

因此,迭代器it本身并不能保证在语句之后有效myvect.insert(it, 200),在下一条指令(myvect.insert(it + 4, 400))中使用它又是未定义的行为。

您不能期望具有未定义行为的程序有任何东西。它可能会崩溃,给你奇怪的结果,或者(在最坏的情况下)表现得和你预期的一样。

于 2013-02-25T00:26:02.480 回答
1

成员函数需要一个有效的迭代器,该迭代器vector::insert(const_iterator, const value_type&)引用向量但不是有效的迭代器。it+4it+5

在第一次插入之前,it+3是一个有效的(不可解引用的)迭代器,仅指向向量序列的末尾,但it+4无效。插入it 可能会失效,在这种情况下,没有任何表达式 usingit是有效的,当然不是it+5因为该序列此时只有四个元素。

如果像这样更改,代码将是有效的:

it = myvect.begin();
myvect.insert(it,200);
it = myvect.begin();     // make it valid again
myvect.insert(it+4,400);
于 2013-02-25T00:31:18.267 回答