当我尝试使用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.我无法弄清楚其中发生了什么。任何人都可以帮助我吗?
答案 0 :(得分:6)
我不知道你做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
是否会在第二个未指定之前递增。
请记住,post-increment运算符返回迭代器的副本并递增原始迭代器。你在同一个语句中有两次,所以,你最有可能的是it
在最先复制一个最新副本之前增加了两次,然后前一个副本被解除引用第二个
另请参阅Stackoverflow问题的精美答案 Undefined behavior and sequence points