当我尝试使用 vector 的 reverse_iterator 进行遍历时,我在 C++ 中发现了一个非常奇怪的输出。我的代码很简单,像这样:
#include <iostream>
#include <vector>
using namespace std;
int main() {
vector<int> v;
v.push_back(1);
v.push_back(2);
v.push_back(3);
vector<int>::reverse_iterator it = v.rbegin();
cout << *it++ << " " << *it++;
return 0;
}
输出是2 3。我想不通里面发生了什么。谁能帮帮我?
最佳答案
我不知道您使用 C++ 多久了,但是再次欢迎您使用 C++ :-) ...
您刚刚进入Undefined Behaviors的世界和 sequence points
您应该将代码分解为:
#include <iostream>
#include <vector>
using namespace std;
int main() {
vector<int> v;
v.push_back(1);
v.push_back(2);
v.push_back(3);
vector<int>::reverse_iterator it = v.rbegin();
cout << *it;
it++;
cout << " " << *it;
return 0;
}
现在可以使用了...:-)
让我解释一下,让您简要了解原始代码中发生的事情...
这一行
cout << *it++ << " " << *it++;
第一个 it
是否会在第二个之前递增是未指定的。
请记住,后递增运算符返回迭代器的拷贝并递增原始迭代器。你在同一条语句中有两次,所以,你最有可能拥有的是 it
在首先取消引用最新拷贝之前递增两次,然后第二次取消引用前一个拷贝
另请参阅此 Stackoverflow 问题的漂亮答案 Undefined behavior and sequence points
关于使用 cout 和 reverse_iterator 的 C++ 奇怪输出,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35518811/