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.