C++ではstd::map<>::iterator
の型は何ですか?
std::map<A,B>::iterator
型のオブジェクトit
は、operator ->
を返すオーバーロードされたstd::pair<A,B>*
を持ち、std::pair<>
はfirst
およびsecond
メンバーを持つことがわかっています。
しかし、これら2つのメンバは何に対応していますか。また、マップにit->second
として格納されている値にアクセスする必要があるのはなぜですか。
std::vector<X>
にたくさんのX
オブジェクトが格納されていることをご存知でしょうか。しかし、あなたがstd::map<X, Y>
を持っている場合、それが実際に保存するのはstd::pair<const X, Y>
sの全体の束です。それがまさにまさにマップである - それはキーと関連する値を一緒にペアにする。
std::map
を反復処理すると、これらすべてのstd::pair
を反復処理します。これらのイテレータの1つを間接参照すると、キーとそれに関連付けられた値を含むstd::pair
が得られます。
std::map<std::string, int> m = /* fill it */;
auto it = m.begin();
ここで、*it
を実行すると、マップの最初の要素のstd::pair
を取得します。
これで、 std::pair
という型になり、first
とsecond
の2つのメンバーを介してその要素にアクセスできるようになりました。したがって、p
というstd::pair<X, Y>
がある場合、p.first
はX
オブジェクトであり、p.second
はY
オブジェクトです。
std::map
イテレータを間接参照するとstd::pair
が得られることがわかったので、first
とsecond
を使ってその要素にアクセスできます。例えば、(*it).first
はあなたにキーを与え、(*it).second
はあなたに値を与えます。これらはit->first
およびit->second
と同等です。
K
およびvalueがV
で、値がstd::map
であるstd::pair<const K, V>
(そのマップの反復子を間接参照して得られる式の型でもある)の要素の型は、内部ソートを妨げないようにするためにconst
です。マップ値.
std::pair<>
には、first
とsecond
の2つのメンバーがあります( here を参照)。非常に直感的な意味があります。したがって、特定のマップに対してi
というイテレータを使用すると、次の式が得られます。
i->first
これは以下と同等です。
(*i).first
反復子が指すconst
オブジェクトの最初の(pair
)要素を参照します。つまり、を参照します。マップ内のキー。代わりに、式:
i->second
これは以下と同等です。
(*i).second
pair
の2番目の要素、つまり対応する値を参照します。地図で。