回答:
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
、first
andでその要素にアクセスできます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<>
first
and という名前の2つのメンバーがありsecond
(ここを参照)、非常に直感的な意味があります。したがって、i
特定のマップへのイテレータを指定すると、次の式:
i->first
これは次と同等です:
(*i).first
イテレータが指すオブジェクトの最初の(const
)要素をpair
参照します。つまり、マップ内のキーを参照します。代わりに、式:
i->second
これは次と同等です:
(*i).second
の2番目の要素、pair
つまりマップ内の対応する値を参照します。
std::map
はキーと値を格納します。値をmap::iterator.second
参照します。