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