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?


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.


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.


5
Kata-kata "kunci" dan "nilai" akan lebih intuitif daripada "pertama" dan "kedua", yang menyiratkan pemesanan.
— ahoffer
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.