iterator-> secondはどういう意味ですか?


157

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

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

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


14
A std::mapキー値を格納します値をmap::iterator.second参照します
Alok Save 2013

回答:


247

std::vector<X>aがたくさんの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により、2つのメンバーを介してその要素にアクセスできるようにfirstなりsecondます。したがって、がstd::pair<X, Y>呼び出された場合pp.firstXオブジェクトでp.secondあり、Yオブジェクトです。

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


4
プログラミングで他のすべてのように、[0]と[1](「最初」と「2番目」)を使用しないのはなぜですか。

21
@AdamCross operator[]は特定の型を返す必要がfirstありsecondますが、異なる型を持つことができるためです。一方、にstd::tupleは、std::getインデックスによって要素にアクセスするための特別なヘルパー関数があります。
ジョセフマンスフィールド

16

要素の種類std::mapのキーである(また、そのマップの反復子を間接参照して得られた式の型である)Kと値でVあるstd::pair<const K, V>キーは、 - constマップ値の内部ソートを妨害することを防ぐために。

std::pair<>firstand という名前の2つのメンバーがありsecondここを参照)、非常に直感的な意味があります。したがって、i特定のマップへのイテレータを指定すると、次の式:

i->first

これは次と同等です:

(*i).first

イテレータが指すオブジェクトの最初のconst)要素をpair参照します。つまり、マップ内のキーを参照します。代わりに、式:

i->second

これは次と同等です:

(*i).second

2番目の要素、pairつまりマップ内の対応するを参照します。


5
「キー」と「値」という単語は、順序付けを意味する「最初」と「2番目」よりも直感的でした。
ahoffer '05
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.