2017-10-30 11 views
-1

私はC++を学ぶコースを取っており、このコースの一環として、インストラクターのビデオで動作するサンプルコードが提供されています。しかし、プログラムの一部が私に問題を起こしています。Visual Studio/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; 
} 

編集:ループの最後の繰り返しの間に

を追加しましたエラーメッセージ

enter image description here

+0

イメージは実行時に表示される画像です。 – user1543042

+0

@DimChtzそのバージョンは最初の要素を反復しません –

+0

これは[the - >演算子]のケースだと思います(https://stackoverflow.com/questions/1642028/what-is-the-operator-in-c ): 'for(auto i = vi1.size(); i - > 0;)' –

答えて

2

itはそのコンテナ、vi1の開始前であることを減らされます。これにより、範囲外のイテレータが発生します。 Visual Studioのデバッグビルドでこれが検出され、エラーが表示されます。リリースビルドはこの問題を検出しません。

このインスタンスでクラッシュすることはありませんが、最初の要素の前にイテレータを減らすと、他のコンテナタイプでクラッシュやその他の未定義動作が発生する可能性があります。このような反復子を逆参照しようとすると、未定義の動作にもなります。

rbegin()およびrend()は、リバースイテレータを返す標準ライブラリメソッドです。

関連する問題