下面的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会改变元素的顺序吗?
谢谢
您的程序具有未定义的行为.
您正在创建一个包含3个元素的向量(全部初始化为0),并且您在位置处插入元素v.begin() + 5,这超出了向量的末尾.
此外,您正在使用迭代器(it)在位置指向之前插入元素之后it.根据C++ 11标准的第23.3.6.5/1段:
[...]如果没有重新分配,插入点之前的所有迭代器和引用仍然有效.[...]
因此,it在语句之后,迭代器本身不能保证有效myvect.insert(it, 200),并且在下一条指令(myvect.insert(it + 4, 400))中使用它也是未定义的行为.
您不能指望任何具有未定义行为的程序.它可能会崩溃,给你奇怪的结果,或者(在最坏的情况下)表现得像你期望的那样.