ตัววนซ้ำ -> วินาทีหมายความว่าอะไร


157

ใน C ++ ประเภทของ a std::map<>::iteratorคืออะไร?

เรารู้ว่าอ็อบเจกต์itประเภทstd::map<A,B>::iteratorมีการโอเวอร์โหลดoperator ->ซึ่งส่งคืน a std::pair<A,B>*และว่าstd::pair<>มีfirstและsecondสมาชิก

แต่สมาชิกสองคนนี้ทำอะไรกันและทำไมเราต้องเข้าถึงค่าที่เก็บไว้ในแผนที่ด้วยit->second?


14
std::mapเก็บกุญแจและคุ้มค่า map::iterator.secondหมายถึงความคุ้มค่า
Alok บันทึก

คำตอบ:


247

ฉันแน่ใจว่าคุณรู้ว่าstd::vector<X>ร้านค้าทั้งกลุ่มของXวัตถุใช่มั้ย? แต่ถ้าคุณมีstd::map<X, Y>สิ่งที่มันจริงร้านค้าเป็นทั้งกลุ่มของstd::pair<const X, Y>s นั่นคือสิ่งที่แผนที่ - มันจับคู่คีย์และค่าที่เกี่ยวข้อง

เมื่อคุณทำซ้ำ a std::mapคุณจะทำซ้ำสิ่งเหล่านี้std::pairทั้งหมด เมื่อคุณทำการอ้างอิงซ้ำหนึ่งในตัววนซ้ำเหล่านี้คุณจะได้รับstd::pairรหัสและค่าที่เกี่ยวข้อง

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

ที่นี่ถ้าคุณทำตอนนี้*itคุณจะได้รับstd::pairองค์ประกอบแรกในแผนที่

ตอนนี้ชนิดstd::pairช่วยให้คุณเข้าถึงองค์ประกอบผ่านสองสมาชิก: และfirst secondดังนั้นถ้าคุณมีstd::pair<X, Y>ที่เรียกว่าp, p.firstเป็นXวัตถุและp.secondเป็นYวัตถุ

ดังนั้นตอนนี้คุณรู้ว่า dereferencing std::mapiterator ช่วยให้คุณstd::pairแล้วคุณสามารถเข้าถึงองค์ประกอบด้วยและfirst secondตัวอย่างเช่น(*it).firstจะให้คีย์และ(*it).secondจะให้คุณค่าแก่คุณ เหล่านี้จะเทียบเท่ากับและit->firstit->second


4
ทำไมพวกเขาไม่ใช้ [0] และ [1] (สำหรับ "first" และ "second") เหมือนทุกอย่างในการเขียนโปรแกรม

21
@ AdamCross เพราะoperator[]ต้องคืนค่าชนิดที่ระบุ แต่firstและsecondอาจมีประเภทที่แตกต่างกัน ในอีกทางหนึ่งstd::tupleมีฟังก์ชั่นผู้ช่วยพิเศษstd::getสำหรับการเข้าถึงองค์ประกอบโดยดัชนี
Joseph Mansfield

16

ประเภทขององค์ประกอบของstd::map(ซึ่งเป็นประเภทของนิพจน์ที่ได้รับโดยการยกเลิกการวนซ้ำของแผนที่นั้น) ซึ่งมีคีย์คือKและค่าVคือstd::pair<const K, V>- ที่สำคัญคือconstเพื่อป้องกันคุณจากการแทรกแซงการเรียงลำดับภายในของค่าแผนที่

std::pair<>มีสมาชิกสองคนชื่อfirstและsecond(ดูที่นี่ ) มีความหมายค่อนข้างง่าย ดังนั้นให้ตัววนซ้ำiไปยังแผนที่ที่แน่นอนการแสดงออก:

i->first

ซึ่งเทียบเท่ากับ:

(*i).first

หมายถึงเป็นครั้งแรก ( constองค์ประกอบ) ของpairวัตถุชี้ไปตาม iterator - การคือมันหมายถึงกุญแจสำคัญในแผนที่ แทนการแสดงออก:

i->second

ซึ่งเทียบเท่ากับ:

(*i).second

อ้างถึงองค์ประกอบที่สองของpair- เช่นค่าที่สอดคล้องกันในแผนที่


5
คำว่า "คีย์" และ "ค่า" จะใช้งานง่ายกว่า "แรก" และ "สอง" ซึ่งหมายถึงการสั่งซื้อ
ahoffer
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.