Visual Studio/C++;:反向迭代器编译,但在运行时抛出错误 我正在学习一门课程C++,作为本课程的一部分,提供了一些示例代码(它在教师的视频中运行)。然而,程序的一部分给了我一个问题
通过搜索,我意识到我可以使用反向迭代器;但是,我希望有人能解释为什么下面的代码在VS C++中抛出运行时错误,但是在Linux(G++)中却没有。Visual Studio/C++;:反向迭代器编译,但在运行时抛出错误 我正在学习一门课程C++,作为本课程的一部分,提供了一些示例代码(它在教师的视频中运行)。然而,程序的一部分给了我一个问题,c++,visual-studio,g++,C++,Visual Studio,G++,通过搜索,我意识到我可以使用反向迭代器;但是,我希望有人能解释为什么下面的代码在VS C++中抛出运行时错误,但是在Linux(G++)中却没有。 #包括 #包括 使用名称空间std; int main(int argc,字符**argv){ 向量vi1={1,2,3,4,5,6,7,8,9,10}; 向量::迭代器it;//向量迭代器 //双向迭代器--向前或向后迭代 //允许-- cout在循环的最后一次迭代中,它被递减到其容器开始之前,vi1。这将导致一个越界迭代器。Visual Stud
#包括
#包括
使用名称空间std;
int main(int argc,字符**argv){
向量vi1={1,2,3,4,5,6,7,8,9,10};
向量::迭代器it;//向量迭代器
//双向迭代器--向前或向后迭代
//允许--
cout在循环的最后一次迭代中,它
被递减到其容器开始之前,vi1
。这将导致一个越界迭代器。Visual Studio的调试版本将检测到这一点,并向您显示得到的错误。发布版本不会检测到此问题
虽然在本例中不会导致崩溃,但在第一个元素之前减少迭代器可能会导致崩溃或其他容器类型的其他未定义行为。尝试取消引用此类迭代器也是未定义行为
rbegin()
和rend()
是返回反向迭代器的标准库方法。图像是我运行时出现的。@DimChtz该版本不会迭代第一个元素我想这是一个例子:for(auto I=vi1.size();I-->0;)
#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;
}