176

C ++では、?のタイプは何std::map<>::iteratorですか?

itタイプのオブジェクトには、を返すstd::map<A,B>::iteratorオーバーロードがあり、にはとメンバーがあることがわかっています。operator ->std::pair<A,B>*std::pair<>firstsecond

しかし、これら2つのメンバーは何に対応しているのでしょうか。また、マップに格納されている値にアクセスする必要があるのはなぜit->secondですか。

4

3 に答える 3

287

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>呼び出された がある場合pp.firstXオブジェクトでp.secondあり、Yオブジェクトです。

std::mapこれで、イテレータを逆参照すると が得られることがわかりました。std::pairその後、 と を使用してその要素にアクセスできfirstますsecond。たとえば、(*it).firstはキーを(*it).second提供し、値を提供します。it->firstこれらはおよび と同等it->secondです。

于 2013-03-16T16:04:19.040 に答える
22

キーがで値が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

于 2013-03-16T16:00:31.123 に答える