我正在参加一门学习 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;
}
编辑:
添加了错误信息
在循环的最后一次迭代期间,it
递减到它的容器开始之前,vi1
。这会导致越界迭代器。使用 Visual Studio 的调试版本将检测到这一点并向您显示您得到的错误。发布版本不会检测到这个问题。
虽然在此实例中不会导致崩溃,但在第一个元素之前递减迭代器可能会导致崩溃或其他容器类型的其他未定义行为。尝试取消引用这样的迭代器也是未定义行为。
rbegin()
和rend()
是返回反向迭代器的标准库方法。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句