C++的向量元素的顺序

Anu*_*hke 2 c++ vector

下面的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];
}
Run Code Online (Sandbox Code Playgroud)

输出:

200
400
Run Code Online (Sandbox Code Playgroud)

并且相同的代码有微小的变化

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];
}
Run Code Online (Sandbox Code Playgroud)

输出:

400
200
Run Code Online (Sandbox Code Playgroud)

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

谢谢

And*_*owl 7

您的程序具有未定义的行为.

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

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

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

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

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