2

c++ のすべての変数には、 in のような型int iiあり、 type がありintます。同様に、STL にはイテレータがあり、次のように宣言します。

       map<string,int>::iterator it .

ここの型は何itですか?int やその他の型を格納するベクトルの場合、それらの itearor によって関連付けられた値またはポイントされた値を取得するために反復子を一般的に参照するので、それはポインター型ですか、それともポインター型ですか? または、演算子*は STL の反復子に対してオーバーロードされていますか?

4

2 に答える 2

6

の種類は何itですか?

の型はitismap<string,int>::iteratorで、これは多数の演算子がオーバーロードされたクラスです。

一部のコンテナー タイプでContainer::iterator 、生のポインター タイプである場合があります。の場合map、それはクラスでなければなりません。

于 2012-04-28T13:45:09.997 に答える
5

24.2.1/1 [iterator.requirements.general] はそれをうまくまとめています:

反復子は、C++ プログラムがさまざまなデータ構造 (コンテナー) を統一された方法で操作できるようにするポインターの一般化です。さまざまなタイプのデータ構造で正しく効率的に機能するテンプレート アルゴリズムを構築できるようにするために、ライブラリはインターフェイスだけでなく、イテレータのセマンティクスと複雑さの仮定も形式化します。

「ポインターの一般化」というフレーズは、ポインター反復子であることを意味します。std::vector<T>::iteratortypedef にすることができますT *。ただし、ほとんどの反復子は、演算子のオーバーロードによってインターフェイスを実現します。(イテレータもコンテナに属している必要はないことに注意してください。)

このような言語は、C++ 標準の記述方法の非常に典型的なものです。物事がどのように動作するかを説明しますが、基本クラスの観点からインターフェイスを定義することは避けます。入力、出力、順方向、双方向、ランダムアクセスなど、さまざまな種類の反復子があります。それぞれに異なる仕様があり、ランダム アクセスは双方向インターフェイスの厳密なスーパーセットですが、C++ 型システムではまったく関係ありません。

++イテレータは、オーバーロードされた任意のクラス*、および の有効な特殊化である可能性がありstd::iterator_traitsます。必要なインターフェースを定義するために使用する基本クラスがあります。これは、C++ のジェネリック プログラミングと特性クラスの良いケース スタディです。std::iteratorstd::iterator_traits

于 2012-04-28T13:51:52.583 に答える