2012-01-03 1 views
1

を変更する場合は、次のコードスニペットは、の実行時にエラーメッセージを表示します。ベクトルイテレータないdereferenceableイテレータcomparisson

デバッグアサーションに失敗しました:

for(it=stat1vec.begin(); *(it)>=investigated_stat; it++, positioner++) 
    { 


     if(*it==investigated_stat) 
      equalwith++; 

    } 

ベクトルのイテレータdereferenceableないように変更した場合:

for(it=stat1vec.begin(); *(it)==investigated_stat; it++, positioner++) 
     { 


      if(*it==investigated_stat) 
       equalwith++; 

     } 

コードは完全に機能します。

すべての行われているが、なぜこれが

です==する=>変更することがありますか?

どうもありがとうございました

+1

'='、私はあなたが 'を使用することを意図割り当てと思うされ==:シーケンス(アルゴリズムを使用していないとき、つまり)を反復処理するための慣用的な方法は、次のようになりますことを

注意'、そう?さらに、一時オブジェクトの構築を避けるためには、イテレータで 'it ++'より '++ it'を使う方が良いでしょう。 – hochl

+1

@hochlオプティマイザは、ほとんどの場合、演算子に関係なく一時的に除外されます。 –

+0

習慣に入るのは良いことです。 –

答えて

3

あなたはそれを逆参照する前に、有効なイテレータであることをイテレータのためにテストする必要があります。ループは*it < investigated_statまで続きますが、要素のいずれもが>= investigated_statでなくても、ベクトルの最後を反復するとループは停止しません。

でのテストでは、forループである必要があります

it != stat1vec.end() && *it >= investigated_stat 

わずかfor修正:

for(it = stat1vec.begin(); it != stat1vec.end() && *it >= investigated_stat; ++it, ++positioner) 
    if(*it == investigated_stat) 
     ++equalwith; 
2

それはあなたが*(it)にゼロを割り当てられたベクトルの終わりに到達する前にいくつかの点でいるようです:この時点でループは終了しました。論理的な比較は何か違うものを見つけようとしました - 失敗しました。私はあなたも同様に2番目のループに==を書くことを意味すると仮定します。

for (it = v.begin(), end = v.end(); it != end /* possible additional conditions */; ++it) 
{ 
    ... 
} 
+0

Kuhl yeah私はコピーして間違って私のコンパイラから貼り付けてしまった。 –

関連する問題