我正在学习C ++课程,作为本课程的一部分,我们提供了一些示例代码(在教师的视频中有效)。但是,程序的一部分给了我一个问题。
在搜索SO时,我意识到我可以使用反向迭代器;但是,我希望有人可以解释为什么下面的代码会在VS C ++中抛出运行时错误,但在Linux中却没有(使用g ++)。
#include <iostream>
#include <vector>
using namespace std;
int main( int argc, char ** argv ) {
vector<int> vi1 = { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10 };
vector<int>::iterator it; // vector iterator
// bidirectional iterator -- iterate forward or backward
// allows it--
cout << "bidirectional iterator:" << endl;
for(auto it = vi1.end() - 1; it >= vi1.begin(); --it) {
cout << *it << " ";
}
cout << endl;
return 0;
}
编辑:
添加了错误消息
答案 0 :(得分:2)
在循环的最后一次迭代期间,it
递减到其容器的开始vi1
之前。这导致了一个越界的迭代器。使用Visual Studio进行的调试构建将检测到这一点,并向您显示您获得的错误。发布版本不会检测到此问题。
虽然它不会导致此实例崩溃,但在第一个元素导致崩溃或其他容器类型的其他未定义行为之前减少迭代器。试图取消引用这样的迭代器也是Undefined Behavior。
rbegin()
和rend()
是返回反向迭代器的标准库方法。