質問: c++ vs2005におけるイテレーターの動作 過去にvisual studio c++ 6.0 で作成したプロジェクトを、visual studio c++ 2005に変換し、ビルドしてみたところ、イテレーターに関する操作をしているところでエラーが出ました。 ---------- ソースの一部抜粋 ここから ------------- vector array; // int型の動的配列 arrayに要素をpush_backする処理 while( it && it != array.end() ) // 末尾要素まで { cout << *it << endl; // *演算子で間接参照 ++it; // イテレータを1つ進める } ---------- ソースの一部抜粋 ここまで ------------- 上記のwile文のところで以下のようなエラーが発生します。 ---------- エラーメッセージ ここから ------------- error c2676: 二項演算子 '&&' : 'std::_vector_iterator<_ty,_alloc>' は、この演算子または定義済の演算子に適切な型への変換の定義を行いません。(新しい動作; ヘルプを参照) 1> with 1> [ 1> _ty=char, 1> _alloc=std::allocator 1> ] ---------- エラーメッセージ ここまで ------------- とりあえず、"while( it && it != array.end() ) "を"while( *it!=null && it != array.end() ) "とするとエラーはでなくなりましたが、なぜもとのように書いてはダメなのかがさっぱりわかりません。 そもそも、itと*itでは、示す内容が違っているので、これでは解決になっていないのでは、という気もします。 ヘルプを見ても、vs6.0とvs2005でvectorやiteratorの動作が変わっていることが読み取れず、困っています。 どなたかご教授ください。
回答: iteratorはコンテナ内のどこか1要素またはendを示します。 ヒント1: end は"最後の要素"・・・ではありません。 ヒント2: コンテナが空のとき、begin() == end()になる。 ポインタのようなもの、と解釈されても結構ですが 即物的なものではなくて、概念的な(コンテナ内のどこかを指す)もの、 と解釈されたほうが良いと思いますよ