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