3

C++ のデバッグ モードでセット イテレータを使用しようとすると、「マップ/セット イテレータは参照解除できません」というエラーが表示されます。逆参照はイテレータの使用方法だと思っていたのでわかりません。コードは次のようになります。

set<int>::iterator myIterator;
for(myIterator = mySet.begin();
    myIterator != mySet.end();
    myIterator++)
    DoSomething(*myIterator)

これは、イテレータの使用方法についてオンラインで見たすべての例の形式です。私は何を間違っていますか?

4

4 に答える 4

7

セットを変更するとDoSomething()(項目を削除または挿入する)、保持している反復子が無効になり、おそらくこのエラーが発生します。

于 2009-12-14T22:10:41.203 に答える
2

あなたが間違っている最初で最大のことは、このようなコードを書くことです。あなたが上に持っているものは、手動で書かれたものです:

std::for_each(mySet.begin(), mySet.end(), DoSomething);

アルゴリズムの実装以外で、イテレータを本当に適切に使用する例はほとんどありません。たまに、マップまたはマルチマップ (または unordered_[multi]map) を使用するのが合理的ですが、それは主に std::pair を使用してマップとマルチマップを補っていますが、これはまったく素晴らしいことではありません。

于 2009-12-14T22:44:28.910 に答える
1

この質問は誤った前提に基づいていました。「map/set iterator not dereferencable」というエラーが表示され、それはすべての map/set イテレーターに適用される一般的なステートメントであると考えましたが、これは意味をなさないと言っていました。しかし、もう一度調べたところ、本当の問題は、そのイテレータにアクセスするために使用していたポインタが無効だったということだけでした。

于 2009-12-14T22:44:06.943 に答える
1

このエラーは通常、「end()」反復子にアクセスしていることを意味します。

于 2009-12-14T22:10:43.903 に答える