web-dev-qa-db-ja.com

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

C++ではstd::map<>::iteratorの型は何ですか?

std::map<A,B>::iterator型のオブジェクトitは、operator ->を返すオーバーロードされたstd::pair<A,B>*を持ち、std::pair<>firstおよびsecondメンバーを持つことがわかっています。

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

138
Noich

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

std::mapイテレータを間接参照するとstd::pairが得られることがわかったので、firstsecondを使ってその要素にアクセスできます。例えば、(*it).firstはあなたにキーを与え、(*it).secondはあなたに値を与えます。これらはit->firstおよびit->secondと同等です。

214

KおよびvalueがVで、値がstd::mapであるstd::pair<const K, V>(そのマップの反復子を間接参照して得られる式の型でもある)の要素の型は、内部ソートを妨げないようにするためにconstです。マップ値.

std::pair<>には、firstsecondの2つのメンバーがあります( here を参照)。非常に直感的な意味があります。したがって、特定のマップに対してiというイテレータを使用すると、次の式が得られます。

i->first

これは以下と同等です。

(*i).first

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

i->second

これは以下と同等です。

(*i).second

pair2番目の要素、つまり対応するを参照します。地図で。

13
Andy Prowl