回答:
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>呼び出された場合p、p.firstはXオブジェクトでp.secondあり、Yオブジェクトです。
std::mapイテレータを逆参照するとが提供されることがわかったのでstd::pair、firstandでその要素にアクセスできますsecond。たとえば、(*it).firstはキー(*it).secondを提供し、値を提供します。これらはit->firstおよびと同等it->secondです。
operator[]は特定の型を返す必要がfirstありsecondますが、異なる型を持つことができるためです。一方、にstd::tupleは、std::getインデックスによって要素にアクセスするための特別なヘルパー関数があります。
要素の種類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つまりマップ内の対応する値を参照します。
std::mapはキーと値を格納します。値をmap::iterator.second参照します。