แผนที่ใน C++ ไลบรารีเทมเพลตมาตรฐาน (STL)
⚡ สรุปอย่างชาญฉลาด
แผนที่ใน C++ เป็นคอนเทนเนอร์แบบเชื่อมโยงจากไลบรารีเทมเพลตมาตรฐานที่จัดเก็บองค์ประกอบเป็นคู่คีย์-ค่าที่เรียงลำดับ โดยแต่ละคีย์ที่ไม่ซ้ำกันจะแมปกับค่าหนึ่งค่า และช่วยให้ค้นหา แทรก และสำรวจตามลำดับได้อย่างรวดเร็ว

แผนที่อยู่ในอะไร C++?
In C++MAP คือคอนเทนเนอร์แบบเชื่อมโยงที่จัดเก็บรายการในรูปแบบที่แมปไว้ แต่ละรายการในแผนที่ประกอบด้วยค่าคีย์และค่าที่แมปไว้ ค่าที่แมปไว้สองค่าไม่สามารถใช้ค่าคีย์เดียวกันได้
ค่าคีย์มีประโยชน์สำหรับการจัดเรียงและระบุองค์ประกอบได้อย่างเฉพาะเจาะจง ในขณะที่ค่าที่แมปไว้จะจัดเก็บเนื้อหาที่เกี่ยวข้องกับแต่ละคีย์ ทั้งสองอาจแตกต่างกันในประเภท แต่ประเภทสมาชิกจะรวมเข้าด้วยกันเป็นคู่ที่เก็บทั้งสองอย่างไว้ด้วยกัน
ก่อนที่จะเขียนโค้ดใดๆ การเข้าใจว่าทำไมแผนที่ (map) จึงมักเป็นคอนเทนเนอร์ที่เหมาะสมที่สุดนั้นจะเป็นประโยชน์
เหตุใดจึงต้องใช้ std::map
ต่อไปนี้คือเหตุผลที่ควรใช้แผนที่:
- std::map จะเก็บเฉพาะคีย์ที่ไม่ซ้ำกัน โดยเรียงลำดับตามเกณฑ์การเรียงลำดับที่เลือกไว้
- การค้นหาองค์ประกอบโดยใช้คีย์นั้นง่ายและรวดเร็ว
- แต่ละคีย์แนบองค์ประกอบเดียวเท่านั้น
- std::map สามารถใช้เป็นอาร์เรย์ที่เชื่อมโยงได้
- std::map สามารถนำไปใช้งานได้โดยใช้โครงสร้างต้นไม้ไบนารีแบบสมดุล
เพื่อนำข้อดีเหล่านี้ไปใช้ประโยชน์ ให้เริ่มต้นด้วยไวยากรณ์การประกาศ
วากยสัมพันธ์
หากต้องการประกาศ std::map ให้ใช้ไวยากรณ์นี้:
std::map<key_datatype, value_datatype>map_name;
- การขอ ประเภทข้อมูลคีย์ หมายถึงประเภทข้อมูลของคีย์แผนที่
- การขอ ประเภทข้อมูลค่า หมายถึงประเภทข้อมูลของค่าที่สอดคล้องกับคีย์แผนที่
- การขอ map_name คือชื่อแผนที่
ตัวอย่างเช่น:
map<string, int> my_map;
เราได้ประกาศแผนที่ชื่อ my_map โดยแผนที่นี้จะมีสตริงเป็นชนิดข้อมูลคีย์ และจำนวนเต็มเป็นชนิดข้อมูลค่า
ประเภทสมาชิก
ฟังก์ชันสมาชิกสามารถใช้ประเภทสมาชิกต่อไปนี้เป็นพารามิเตอร์หรือประเภทส่งคืนได้:
- คีย์_ประเภท: คีย์ (พารามิเตอร์แรกในเทมเพลต)
- แมป_ประเภท: T (พารามิเตอร์ตัวที่สองในเทมเพลต)
- คีย์_เปรียบเทียบ: เปรียบเทียบ (พารามิเตอร์ที่สามในเทมเพลต)
- ตัวจัดสรร_ประเภท: จัดสรร (พารามิเตอร์ที่สี่ในเทมเพลต)
- ค่า_ประเภท: คู่
- มูลค่า_เปรียบเทียบ: คลาสฟังก์ชันที่ซ้อนกันสำหรับการเปรียบเทียบองค์ประกอบ
- อ้างอิง: allocator_type::การอ้างอิง
- const_reference: allocator_type::const_reference
- ตัวชี้: allocator_type::ตัวชี้
- const_pointer: allocator_type::const_pointer
- ตัววนซ้ำ: ตัววนซ้ำแบบสองทิศทางไปยัง value_type
- const_iterator: ตัววนซ้ำแบบสองทิศทางไปยัง const value_type
- ย้อนกลับ_ตัววนซ้ำ: ตัววนซ้ำแบบย้อนกลับ
- const_reverse_iterator: ตัววนซ้ำแบบย้อนกลับคงที่
- ความแตกต่าง_ประเภท: ptrdiff_t
- ขนาด_ประเภท: ขนาด_t
ฟังก์ชั่นในตัวของ std::map
std::map มาพร้อมกับฟังก์ชั่น inbuilt บางส่วนได้แก่:
- เริ่มต้น () – ฟังก์ชันนี้จะส่งคืนตัววนซ้ำไปยังรายการแรกของแผนที่
- ขนาด() – ฟังก์ชันนี้จะส่งคืนจำนวนรายการในแผนที่
- ว่างเปล่า() – ฟังก์ชันนี้จะส่งคืนค่าบูลีนที่ระบุว่าแผนที่นั้นว่างเปล่าหรือไม่
- แทรก (คู่ (คีย์, ค่า)) – ฟังก์ชันนี้จะแทรกคู่คีย์-ค่าใหม่ลงในแผนที่ (map)
- หาค่า (val) – ฟังก์ชันนี้จะส่งคืนตัววนซ้ำไปยังองค์ประกอบ val หากพบ มิฉะนั้นจะส่งคืน m.end()
- ลบ (ตำแหน่งตัววนซ้ำ) – ฟังก์ชันนี้จะลบรายการที่ตำแหน่งที่ชี้โดยตัววนซ้ำ
- ลบ(const g) – ฟังก์ชันนี้จะลบคู่คีย์-ค่า g ออกจากแผนที่ (map)
- ชัดเจน() – ฟังก์ชันนี้จะลบรายการทั้งหมดออกจากแผนที่
เมื่อกำหนดฟังก์ชันต่างๆ แล้ว ตัวอย่างต่อไปนี้จะนำฟังก์ชันเหล่านั้นไปใช้ โดยเริ่มจากกระบวนการวนซ้ำ
การวนซ้ำองค์ประกอบแผนที่
คุณสามารถวนซ้ำผ่านองค์ประกอบในแผนที่ได้ เราเพียงแค่ต้องสร้างตัววนซ้ำและใช้มันเพื่อทำเช่นนั้น ตัวอย่างเช่น:
1 ตัวอย่าง
#include <iostream> #include <string> #include <map> using namespace std; int main() { map<int, string> Students; Students.insert(std::pair<int, string>(200, "Alice")); Students.insert(std::pair<int, string>(201, "John")); cout << "Map size is: " << Students.size() << endl; cout << endl << "Default map Order is: " << endl; for (map<int, string>::iterator it = Students.begin(); it != Students.end(); ++it) { cout << (*it).first << ": " << (*it).second << endl; } }
Output:
นี่คือภาพหน้าจอของรหัส:
Code คำอธิบาย:
- รวมไฟล์ส่วนหัว iostream ลงในโค้ดของเราเพื่อใช้ฟังก์ชันต่างๆ
- รวมไฟล์ส่วนหัวของสตริงลงในโค้ดของเราเพื่อใช้ฟังก์ชันต่างๆ
- รวมไฟล์ส่วนหัวของแผนที่ลงในโค้ดของเราเพื่อใช้ฟังก์ชันต่างๆ
- รวมเนมสเปซมาตรฐานไว้ในโค้ดของเราเพื่อใช้คลาสโดยไม่ต้องเรียกมัน
- เรียกใช้ฟังก์ชัน main() { เป็นจุดเริ่มต้นของเนื้อความของฟังก์ชัน
- สร้างแผนที่ชื่อ Students โดยที่คีย์จะเป็นจำนวนเต็ม และค่าจะเป็นสตริง
- แทรกค่าลงในแผนที่นักเรียน คีย์ 200 และค่าของ Alice จะถูกแทรกลงในแผนที่
- แทรกค่าลงในแผนที่นักเรียน คีย์ 201 และค่าของ John จะถูกแทรกลงในแผนที่
- ใช้ฟังก์ชัน `size()` เพื่อหาขนาดของแผนที่ชื่อ `Students` ผลลัพธ์ที่ได้ควรเป็น 2
- พิมพ์ข้อความบนคอนโซล
- ใช้ for loop เพื่อสร้างตัววนซ้ำโดยตั้งชื่อเพื่อวนซ้ำองค์ประกอบของแผนที่ชื่อ Students
- พิมพ์ค่าของแผนที่นักเรียนบนคอนโซล
- ส่วนท้ายของ for loop
- ส่วนท้ายของฟังก์ชัน main()
การแทรกข้อมูลใน std::map
คุณสามารถเพิ่มรายการลงใน std::map โดยใช้ฟังก์ชัน insert() โปรดจำไว้ว่าคีย์ของ std::map ต้องไม่ซ้ำกัน
ดังนั้น ขั้นแรกจะตรวจสอบว่าแต่ละคีย์มีอยู่ในแผนที่หรือไม่ หากมีอยู่แล้ว ระบบจะไม่แทรกรายการ แต่จะส่งคืนตัววนซ้ำสำหรับรายการที่มีอยู่ หากไม่มีอยู่ ระบบจะแทรกรายการนั้นเข้าไป
ฟังก์ชั่นมีรูปแบบต่างๆ ดังต่อไปนี้:
- แทรก (คู่) – ด้วยรูปแบบนี้ จะมีการแทรกคู่คีย์-ค่าเข้าไปในแผนที่
- แทรก (start_itr, end_itr) – ด้วยรูปแบบนี้ ข้อมูลจะถูกแทรกเข้าไปภายในช่วงที่กำหนดโดย start_itr และ end_itr จากแผนที่อื่น
ฟังก์ชัน insert_or_assign() ทำงานในลักษณะเดียวกับฟังก์ชัน insert() แต่ถ้าคีย์ที่กำหนดมีอยู่ในแผนที่อยู่แล้ว ค่าของคีย์นั้นจะถูกแก้ไข
2 ตัวอย่าง
#include <map> #include <iostream> using namespace std; int main() { map<int, int> m{ {1,3} , {2,4} , {3,5} }; m.insert({ 5, 6 }); m.insert({ 1, 8 }); m.insert_or_assign(1, 6); cout << "Key\tElement\n"; for (auto itr = m.begin(); itr != m.end(); ++itr) { cout << itr->first << '\t' << itr->second << '\n'; } return 0; }
Output:
นี่คือภาพหน้าจอของรหัส:
Code คำอธิบาย:
- รวมไฟล์ส่วนหัวของแผนที่ลงในโค้ดของเราเพื่อใช้ฟังก์ชันต่างๆ
- รวมไฟล์ส่วนหัว iostream ลงในโค้ดของเราเพื่อใช้ฟังก์ชันต่างๆ
- รวมเนมสเปซมาตรฐานไว้ในโค้ดของเราเพื่อใช้คลาสโดยไม่ต้องเรียกมัน
- เรียกใช้ฟังก์ชัน main() { เป็นจุดเริ่มต้นของเนื้อความของฟังก์ชัน
- สร้างแผนที่ชื่อ m โดยที่คีย์จะเป็นจำนวนเต็ม และค่าจะเป็นจำนวนเต็ม มีการสร้างรายการสามรายการลงในแผนที่
- แทรกรายการใหม่ลงในแผนที่ m คีย์ 5 และค่า 6 จะถูกแทรกลงในแผนที่
- กำลังพยายามสร้างรายการลงในคีย์ที่มีอยู่แล้ว เนื่องจากคีย์ 1 มีอยู่แล้วในแผนที่ จึงไม่สามารถป้อนข้อมูลได้
- ใช้ฟังก์ชัน insert_or_assign() เพื่อแทรกหรือแก้ไขรายการที่มีอยู่แล้ว เนื่องจากคีย์ 1 มีอยู่แล้ว ค่าของมันจะถูกเปลี่ยนเป็น 6
- พิมพ์ข้อความบนคอนโซล อักขระ “\t” สร้างช่องว่างแนวนอนในขณะที่อักขระ “\n” เลื่อนเคอร์เซอร์ของเมาส์ไปยังบรรทัดถัดไป
- ใช้ สำหรับห่วง เพื่อสร้างตัววนซ้ำชื่อ itr เพื่อวนซ้ำองค์ประกอบของแผนที่ชื่อ m
- พิมพ์ค่าของแผนที่ m บนคอนโซล อักขระ “\t” สร้างช่องว่างแนวนอนระหว่างแต่ละคีย์และค่าที่สอดคล้องกัน ในทางตรงกันข้าม อักขระ “\n” จะเลื่อนเคอร์เซอร์ของเมาส์ไปยังบรรทัดถัดไปหลังจากการวนซ้ำทุกครั้ง
- ส่วนท้ายของ for loop
- โปรแกรมจะต้องส่งคืนค่าเมื่อดำเนินการเสร็จสิ้น
- ส่วนท้ายของฟังก์ชัน main()
การค้นหาในแผนที่
เราสามารถใช้ฟังก์ชัน find() เพื่อค้นหาองค์ประกอบในแผนที่โดยใช้คีย์ หากไม่พบคีย์ ฟังก์ชันจะส่งคืนค่า std::map::end แต่ถ้าพบ ฟังก์ชันจะส่งคืนตัววนซ้ำขององค์ประกอบที่ค้นหาได้
3 ตัวอย่าง
#include <iostream> #include <string> #include <map> using namespace std; int main() { map<int, string> Students; Students.insert(std::pair<int, string>(200, "Alice")); Students.insert(std::pair<int, string>(201, "John")); std::map<int, string>::iterator it = Students.find(201); if (it != Students.end()) { std::cout << endl << "Key 201 has the value: => "<< Students.find(201)->second << '\n'; } }
Output:
นี่คือภาพหน้าจอของรหัส:
Code คำอธิบาย:
- รวมไฟล์ส่วนหัว iostream ลงในโค้ดของเราเพื่อใช้ฟังก์ชันต่างๆ โดยไม่ได้รับข้อผิดพลาด
- รวมไฟล์ส่วนหัวของสตริงลงในโค้ดของเราเพื่อใช้ฟังก์ชันต่างๆ โดยไม่ได้รับข้อผิดพลาด
- รวมไฟล์ส่วนหัวของแผนที่ลงในโค้ดของเราเพื่อใช้ฟังก์ชันต่างๆ โดยไม่ได้รับข้อผิดพลาด
- รวมเนมสเปซมาตรฐานไว้ในโค้ดของเราเพื่อใช้คลาสโดยไม่ต้องเรียกมัน
- เรียกใช้ฟังก์ชัน main() เครื่องหมาย { แสดงจุดเริ่มต้นของส่วนเนื้อหาของฟังก์ชัน main()
- สร้างแผนที่ชื่อ Students ซึ่งคีย์จะเป็นจำนวนเต็มและสตริงค่า
- แทรกค่าลงในแผนที่นักเรียน คีย์ 200 และค่าของ Alice จะถูกแทรกลงในแผนที่
- แทรกค่าลงในแผนที่นักเรียน คีย์ 201 และค่าของ John จะถูกแทรกลงในแผนที่
- ค้นหาค่าที่เกี่ยวข้องกับคีย์ 201
- ใช้คำสั่ง if เพื่อตรวจสอบว่าพบค่าของคีย์หรือไม่
- พิมพ์ค่าของคีย์ควบคู่ไปกับข้อความบนคอนโซล
- ส่วนท้ายของคำสั่ง if
- ส่วนท้ายของฟังก์ชัน main()
การลบข้อมูลจากแผนที่
เราสามารถใช้ฟังก์ชัน erase() เพื่อลบค่าออกจากแผนที่ได้ โดยการสร้างตัววนซ้ำ (iterator) ที่ชี้ไปยังองค์ประกอบที่ต้องการลบ จากนั้นจึงส่งตัววนซ้ำนั้นไปยังฟังก์ชัน erase()
4 ตัวอย่าง
#include <iostream> #include <string> #include <map> using namespace std; int main() { map<std::string, int> my_map; my_map.insert(std::make_pair("cow", 1)); my_map.insert(std::make_pair("cat", 2)); my_map["lion"] = 3; map<std::string, int>::iterator it = my_map.find("cat"); my_map.erase(it); for (map<string, int>::iterator it = my_map.begin(); it != my_map.end(); ++it) cout << (*it).first << ": " << (*it).second << endl; return 0; }
Output:
นี่คือภาพหน้าจอของรหัส:
Code คำอธิบาย:
- รวมไฟล์ส่วนหัว iostream ลงในโค้ดของเราเพื่อใช้ฟังก์ชันต่างๆ
- รวมไฟล์ส่วนหัวของสตริงลงในโค้ดของเราเพื่อใช้ฟังก์ชันต่างๆ
- รวมไฟล์ส่วนหัวของแผนที่ลงในโค้ดของเราเพื่อใช้ฟังก์ชันต่างๆ
- รวมเนมสเปซมาตรฐานไว้ในโค้ดของเราเพื่อใช้คลาสโดยไม่ต้องเรียกมัน
- เรียกใช้ฟังก์ชัน main() เครื่องหมาย { แสดงจุดเริ่มต้นของส่วนเนื้อหาของฟังก์ชัน main()
- สร้างแผนที่ชื่อ my_map ซึ่งคีย์จะเป็นสตริงและค่าจำนวนเต็ม
- ใส่ค่าลงในแผนที่ my_map คีย์ Cow และค่า 1 จะถูกแทรกลงในแผนที่
- ใส่ค่าลงในแผนที่ my_map คีย์ Cat และค่า 2 จะถูกแทรกลงในแผนที่
- เพิ่มค่า 3 ลงในแผนที่ my_map ด้วยกุญแจรูปสิงโต
- สร้างตัววนซ้ำเพื่อวนซ้ำบนแผนที่ my_map เพื่อค้นหาคีย์ cat
- ลบองค์ประกอบที่ตัววนซ้ำชี้ไป
- ใช้ตัววนซ้ำ (iterator) เพื่อวนซ้ำผ่านองค์ประกอบของแผนที่ my_map ตั้งแต่ต้นจนจบ
- พิมพ์เนื้อหาของแผนที่ my_map บนคอนโซล
- โปรแกรมจะต้องส่งคืนเอาต์พุตเมื่อเสร็จสิ้นสำเร็จ
- ส่วนท้ายของฟังก์ชัน main()






