Apa iterator-> detik artinya?

157

Dalam C ++, apa tipe dari a std::map<>::iterator?

Kita tahu bahwa suatu objek itbertipe std::map<A,B>::iteratormemiliki kelebihan operator ->yang mengembalikan a std::pair<A,B>*, dan bahwa std::pair<>memiliki a firstdan secondanggota.

Tetapi, untuk apa kedua anggota ini berkorespondensi, dan mengapa kita harus mengakses nilai yang disimpan dalam peta it->second?

Noich
sumber
14
A std::mapmenyimpan kunci dan nilai . map::iterator.secondmengacu pada nilai .
Alok Simpan

Jawaban:

247

Saya yakin Anda tahu bahwa std::vector<X>toko menyimpan sejumlah Xbenda, bukan? Tetapi jika Anda memiliki std::map<X, Y>, apa yang sebenarnya disimpan adalah sejumlah besar std::pair<const X, Y>. Begitulah peta itu - itu menyatukan kunci dan nilai terkait.

Ketika Anda mengulangi lebih dari satu std::map, Anda mengulangi semua ini std::pair. Ketika Anda melakukan dereferensi salah satu iterator ini, Anda mendapatkan std::pairkunci berisi dan nilai yang terkait.

std::map<std::string, int> m = /* fill it */;
auto it = m.begin();

Di sini, jika sekarang Anda lakukan *it, Anda akan mendapatkan std::pairuntuk elemen pertama di peta.

Sekarang tipe std::pairmemberi Anda akses ke elemen-elemennya melalui dua anggota: firstdan second. Jadi jika Anda telah seorang std::pair<X, Y>yang disebut p, p.firstadalah Xobjek dan p.secondmerupakan Yobjek.

Jadi sekarang Anda tahu bahwa dereferencing std::mapiterator memberi Anda std::pair, Anda kemudian dapat mengakses elemen-elemennya dengan firstdan second. Misalnya, (*it).firstakan memberi Anda kunci dan (*it).secondakan memberi Anda nilai. Ini setara dengan it->firstdan it->second.

Joseph Mansfield
sumber
4
Mengapa mereka tidak menggunakan [0] dan [1] (untuk "pertama" dan "kedua") seperti yang lainnya dalam pemrograman?
21
@AdamCross Karena operator[]harus mengembalikan tipe tertentu tetapi firstdan seconddapat memiliki tipe yang berbeda. Di sisi lain, std::tuplememiliki fungsi pembantu khusus std::getuntuk mengakses elemen-elemennya dengan indeks.
Joseph Mansfield
16

Jenis elemen dari suatu std::map(yang juga merupakan jenis ekspresi yang diperoleh dengan mereferensikan iterator peta itu) yang kuncinya Kdan nilainya Vadalah std::pair<const K, V>- kuncinya adalah constuntuk mencegah Anda mengganggu pemilahan internal nilai peta.

std::pair<>memiliki dua anggota bernama firstdan second(lihat di sini ), dengan makna yang cukup intuitif. Dengan demikian, diberikan iterator ike peta tertentu, ungkapan:

i->first

Yang setara dengan:

(*i).first

Mengacu pada elemen pertama ( const) dari pairobjek yang ditunjuk oleh iterator - yaitu mengacu pada kunci di peta. Sebaliknya, ungkapan:

i->second

Yang setara dengan:

(*i).second

Mengacu pada kedua unsur pair- yaitu untuk yang sesuai nilai di peta.

Andy Prowl
sumber
5
Kata-kata "kunci" dan "nilai" akan lebih intuitif daripada "pertama" dan "kedua", yang menyiratkan pemesanan.
ahoffer