• ベストアンサー

C++ VS2005におけるイテレーターの動作

過去にVisual Studio C++ 6.0 で作成したプロジェクトを、Visual Studio C++ 2005に変換し、ビルドしてみたところ、イテレーターに関する操作をしているところでエラーが出ました。 ---------- ソースの一部抜粋 ここから ------------- vector<char> 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<char> 1> ] ---------- エラーメッセージ ここまで ------------- とりあえず、"while( it && it != array.end() ) "を"while( *it!=NULL && it != array.end() ) "とするとエラーはでなくなりましたが、なぜもとのように書いてはダメなのかがさっぱりわかりません。 そもそも、itと*itでは、示す内容が違っているので、これでは解決になっていないのでは、という気もします。 ヘルプを見ても、VS6.0とVS2005でvectorやiteratorの動作が変わっていることが読み取れず、困っています。 どなたかご教授ください。

質問者が選んだベストアンサー

  • ベストアンサー
回答No.3

> イテレータのインスタンスを作るときに > it=NULL; > としておいて、後から他のイテレータの値を代入する、 > というようなことはできないのでしょうか? iteratorはポインタではありませんから NULLの代入は合法ではありません。

SSMSE
質問者

お礼

いろいろとご教授いただき、ありがとうございました。 「iteratorはポインタみたいなもの」とイメージしていたのですが、ポインタと同じ用に扱えない部分もあるのですね。 自分でもこのあたりを再確認してみます。 長くお付き合いいただき、本当にありがとうございました。

その他の回答 (3)

  • ddnp009
  • ベストアンサー率25% (15/58)
回答No.4

iteratorはコンテナ内のどこか1要素またはendを示します。 ヒント1: end は"最後の要素"・・・ではありません。 ヒント2: コンテナが空のとき、begin() == end()になる。 ポインタのようなもの、と解釈されても結構ですが 即物的なものではなくて、概念的な(コンテナ内のどこかを指す)もの、 と解釈されたほうが良いと思いますよ

回答No.2

>> itが0/非0かを調べることに何の意味もありません。 > すみませんが、なぜ意味が無いのか、説明をいただけないでしょうか。 vectorの要素が空のとき、array.begin() == array.end() です。 なので while ( it != array.end() ) だけで十分。

SSMSE
質問者

補足

納得しました。ありがとうございました。 ちなみに、イテレータのインスタンスを作るときに it=NULL; としておいて、後から他のイテレータの値を代入する、というようなことはできないのでしょうか? 質問ばかりになってしまい、申し訳ありません・・・

回答No.1

もともとのコード: while( it && it != array.end() ) が間違ってます。 itが0/非0かを調べることに何の意味もありません。

SSMSE
質問者

補足

> itが0/非0かを調べることに何の意味もありません。 すみませんが、なぜ意味が無いのか、説明をいただけないでしょうか。 itがNULLになることは無いのでしょうか? 不勉強で申し訳ありません。

関連するQ&A