แผนที่ใน C++ ไลบรารีเทมเพลตมาตรฐาน (STL)
แผนที่อยู่ในอะไร C++- ไวยากรณ์
In C++, แผนที่ เป็นคอนเทนเนอร์ที่เชื่อมโยงซึ่งจัดเก็บรายการในรูปแบบที่แมป แต่ละรายการในแผนที่ประกอบด้วยคีย์-ค่าและค่าที่แมป ค่าที่แมปสองค่าไม่สามารถใช้ค่าคีย์เดียวกันร่วมกันได้
ค่าคีย์เหมาะสำหรับการเรียงลำดับและระบุองค์ประกอบที่ไม่ซ้ำกัน ค่าที่แมปใช้สำหรับจัดเก็บเนื้อหาที่เกี่ยวข้องกับคีย์ ทั้งสองประเภทอาจแตกต่างกัน แต่ประเภทสมาชิกจะรวมเข้าด้วยกันผ่านประเภทคู่ที่รวมทั้งสองอย่างเข้าด้วยกัน
เหตุใดจึงต้องใช้ std::map
ต่อไปนี้เป็นเหตุผลในการใช้แผนที่:
- std:: map เก็บคีย์เฉพาะตามลำดับการเรียงลำดับตามเกณฑ์การเรียงลำดับที่เลือกเท่านั้น
- การค้นหาองค์ประกอบโดยใช้ปุ่มทำได้ง่ายและรวดเร็วยิ่งขึ้น
- แต่ละคีย์แนบองค์ประกอบเดียวเท่านั้น
- std::map สามารถใช้เป็นอาร์เรย์ที่เชื่อมโยงได้
- std::map สามารถใช้งานได้โดยใช้ binary tree (สมดุล)
วากยสัมพันธ์
หากต้องการประกาศ std::map ให้ใช้ไวยากรณ์นี้:
std::map<key_datatype, value_datatype>map_name;
- เหตุการณ์
key_datatype
หมายถึงประเภทข้อมูลของคีย์แผนที่ - เหตุการณ์
value_datatype
หมายถึงประเภทข้อมูลของค่าที่สอดคล้องกับคีย์แผนที่ - เหตุการณ์
map_name
คือชื่อแผนที่
ตัวอย่างเช่น:
map<string, int> my_map;
เราประกาศแผนที่ชื่อ my_map
- แผนที่จะมีสตริงเป็น สำคัญ ประเภทข้อมูลและจำนวนเต็มเป็น ค่า ประเภทข้อมูล.
ประเภทสมาชิก
ฟังก์ชันสมาชิกสามารถใช้ประเภทสมาชิกต่อไปนี้เป็นพารามิเตอร์หรือประเภทส่งคืนได้:
- คีย์_ประเภท: คีย์ (พารามิเตอร์แรกในเทมเพลต)
- แมป_ประเภท: T (พารามิเตอร์ตัวที่สองในเทมเพลต)
- คีย์_เปรียบเทียบ: เปรียบเทียบ (พารามิเตอร์ที่สามในเทมเพลต)
- ตัวจัดสรร_ประเภท: Alloc (พารามิเตอร์ที่สี่ในเทมเพลต)
- ค่า_ประเภท: คู่
- มูลค่า_เปรียบเทียบ: คลาสฟังก์ชันที่ซ้อนกันสำหรับการเปรียบเทียบองค์ประกอบ
- อ้างอิง: 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 บางส่วนได้แก่:
- เริ่ม() - ฟังก์ชันนี้จะคืนค่าตัววนซ้ำไปยังรายการแรกของแผนที่
- ขนาด() -ฟังก์ชันนี้ส่งคืนจำนวนรายการในแผนที่
- ว่างเปล่า() -ฟังก์ชันนี้ส่งคืนค่าบูลีนเพื่อแสดงว่าแผนที่ว่างเปล่าหรือไม่
- แทรก (คู่ (คีย์, ค่า)) – ฟังก์ชันนี้จะแทรกคู่คีย์-ค่าใหม่ลงในแผนที่
- ค้นหา(วาล) – ฟังก์ชันนี้จะมอบตัววนซ้ำให้กับองค์ประกอบ val หากพบ มิฉะนั้น ฟังก์ชันจะส่งคืน m.end()
- ลบ (ตำแหน่งตัววนซ้ำ) – ฟังก์ชันนี้จะลบรายการที่ตำแหน่งที่ตัววนซ้ำชี้
- ลบ(const g) – ฟังก์ชั่นนี้จะลบคีย์-ค่า g ออกจากแผนที่
- ชัดเจน () -ฟังก์ชั่นนี้จะลบรายการทั้งหมดออกจากแผนที่
การวนซ้ำองค์ประกอบแผนที่
คุณสามารถวนซ้ำองค์ประกอบแผนที่ได้ เราเพียงแค่ต้องสร้างตัววนซ้ำและใช้สำหรับสิ่งนี้
ตัวอย่างเช่น:
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:
นี่คือภาพหน้าจอของรหัส:
คำอธิบายรหัส:
- รวมไฟล์ส่วนหัว iostream ลงในโค้ดของเราเพื่อใช้ฟังก์ชันต่างๆ
- รวมไฟล์ส่วนหัวของสตริงลงในโค้ดของเราเพื่อใช้ฟังก์ชันต่างๆ
- รวมไฟล์ส่วนหัวของแผนที่ลงในโค้ดของเราเพื่อใช้ฟังก์ชันต่างๆ
- รวมเนมสเปซมาตรฐานไว้ในโค้ดของเราเพื่อใช้คลาสโดยไม่ต้องเรียกมัน
- โทร
main()
การทำงาน. { เป็นจุดเริ่มต้นของเนื้อความของฟังก์ชัน - สร้างแผนที่ชื่อ Students โดยที่คีย์จะเป็นจำนวนเต็ม และค่าจะเป็นสตริง
- แทรกค่าลงในแผนที่นักเรียน คีย์ 200 และค่าของ Alice จะถูกแทรกลงในแผนที่
- แทรกค่าลงในแผนที่นักเรียน คีย์ 201 และค่าของ John จะถูกแทรกลงในแผนที่
- ใช้
size()
ฟังก์ชั่นรับขนาดของแผนที่ชื่อนักเรียน นี่ควรคืนค่า 2 - พิมพ์ข้อความบนคอนโซล
- ใช้ for loop เพื่อสร้างตัววนซ้ำโดยตั้งชื่อเพื่อวนซ้ำองค์ประกอบของแผนที่ชื่อ Students
- พิมพ์ค่าของแผนที่นักเรียนบนคอนโซล
- ส่วนท้ายของ for loop
- ส่วนปลายของลำตัว
main()
ฟังก์ชัน
การแทรกข้อมูลใน std::map
คุณสามารถป้อนรายการลงใน std::map โดยใช้ไฟล์ insert()
การทำงาน. โปรดจำไว้ว่าคีย์ std::map จะต้องไม่ซ้ำกัน
ดังนั้นจึงตรวจสอบก่อนว่าแต่ละคีย์มีอยู่ในแผนที่หรือไม่ หากมีอยู่ รายการจะไม่ถูกแทรก แต่จะส่งคืนตัววนซ้ำสำหรับรายการที่มีอยู่ หากไม่มีอยู่ รายการจะถูกแทรก
ฟังก์ชั่นมีรูปแบบต่างๆ ดังต่อไปนี้:
- ใส่(คู่) – ด้วยรูปแบบนี้ คู่คีย์-ค่าจะถูกแทรกลงในแผนที่
- แทรก (start_itr, end_itr) – ด้วยรูปแบบนี้ รายการจะถูกแทรกภายในช่วงที่กำหนดโดย start_itr และ end_itr จากแผนที่อื่น
เหตุการณ์ insert_or_assing() ฟังก์ชั่นทำงานในลักษณะเดียวกับ 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:
นี่คือภาพหน้าจอของรหัส:
คำอธิบายรหัส:
- รวมไฟล์ส่วนหัวของแผนที่ลงในโค้ดของเราเพื่อใช้ฟังก์ชันต่างๆ
- รวมไฟล์ส่วนหัว iostream ลงในโค้ดของเราเพื่อใช้ฟังก์ชันต่างๆ
- รวมเนมสเปซมาตรฐานไว้ในโค้ดของเราเพื่อใช้คลาสโดยไม่ต้องเรียกมัน
- โทร
main()
การทำงาน. { เป็นจุดเริ่มต้นของเนื้อความของฟังก์ชัน - สร้างแผนที่ชื่อ m โดยที่คีย์จะเป็นจำนวนเต็ม และค่าจะเป็นจำนวนเต็ม มีการสร้างรายการสามรายการลงในแผนที่
- แทรกรายการใหม่ลงในแผนที่ m คีย์ 5 และค่า 6 จะถูกแทรกลงในแผนที่
- กำลังพยายามสร้างรายการลงในคีย์ที่มีอยู่แล้ว เนื่องจากคีย์ 1 มีอยู่แล้วในแผนที่ จึงไม่สามารถป้อนข้อมูลได้
- การใช้
insert_or_assign()
ฟังก์ชันเพื่อแทรกหรือแก้ไขรายการที่มีอยู่ เนื่องจากมีคีย์ 1 อยู่แล้ว ค่าจึงจะเปลี่ยนเป็น 6 - พิมพ์ข้อความบนคอนโซล อักขระ “\t” สร้างช่องว่างแนวนอนในขณะที่อักขระ “\n” เลื่อนเคอร์เซอร์ของเมาส์ไปยังบรรทัดถัดไป
- ใช้ สำหรับห่วง เพื่อสร้างตัววนซ้ำชื่อ itr เพื่อวนซ้ำองค์ประกอบของแผนที่ชื่อ m
- พิมพ์ค่าของแผนที่ m บนคอนโซล อักขระ “\t” สร้างช่องว่างแนวนอนระหว่างแต่ละคีย์และค่าที่สอดคล้องกัน ในทางตรงกันข้าม อักขระ “\n” จะเลื่อนเคอร์เซอร์ของเมาส์ไปยังบรรทัดถัดไปหลังจากการวนซ้ำทุกครั้ง
- ส่วนท้ายของตัว for a 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:
นี่คือภาพหน้าจอของรหัส:
คำอธิบายรหัส:
- รวมไฟล์ส่วนหัว iostream ลงในโค้ดของเราเพื่อใช้ฟังก์ชันต่างๆ โดยไม่ได้รับข้อผิดพลาด
- รวมไฟล์ส่วนหัวของสตริงลงในโค้ดของเราเพื่อใช้ฟังก์ชันต่างๆ โดยไม่ได้รับข้อผิดพลาด
- รวมไฟล์ส่วนหัวของแผนที่ลงในโค้ดของเราเพื่อใช้ฟังก์ชันต่างๆ โดยไม่ได้รับข้อผิดพลาด
- รวมเนมสเปซมาตรฐานไว้ในโค้ดของเราเพื่อใช้คลาสโดยไม่ต้องเรียกมัน
- โทร
main()
การทำงาน. { เป็นจุดเริ่มต้นของเนื้อความของmain()
ฟังก์ชัน - สร้างแผนที่ชื่อ Students ซึ่งคีย์จะเป็นจำนวนเต็มและสตริงค่า
- แทรกค่าลงในแผนที่นักเรียน คีย์ 200 และค่าของ Alice จะถูกแทรกลงในแผนที่
- แทรกค่าลงในแผนที่นักเรียน คีย์ 201 และค่าของ John จะถูกแทรกลงในแผนที่
- ค้นหาค่าที่เกี่ยวข้องกับคีย์ 201
- ใช้คำสั่ง if เพื่อตรวจสอบว่าพบค่าของคีย์หรือไม่
- พิมพ์ค่าของคีย์ควบคู่ไปกับข้อความบนคอนโซล
- ส่วนท้ายของคำสั่ง if
- ส่วนปลายของลำตัว
main()
ฟังก์ชัน
การลบข้อมูลจากแผนที่
เราสามารถใช้ไฟล์ erase()
ฟังก์ชั่นลบค่าออกจากแผนที่ เราเพียงแค่สร้างตัววนซ้ำที่ชี้ไปยังองค์ประกอบที่จะลบ จากนั้นตัววนซ้ำจะถูกส่งไปยัง 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:
นี่คือภาพหน้าจอของรหัส:
คำอธิบายรหัส:
- รวมไฟล์ส่วนหัว iostream ลงในโค้ดของเราเพื่อใช้ฟังก์ชันต่างๆ
- รวมไฟล์ส่วนหัวของสตริงลงในโค้ดของเราเพื่อใช้ฟังก์ชันต่างๆ
- รวมไฟล์ส่วนหัวของแผนที่ลงในโค้ดของเราเพื่อใช้ฟังก์ชันต่างๆ
- รวมเนมสเปซมาตรฐานไว้ในโค้ดของเราเพื่อใช้คลาสโดยไม่ต้องเรียกมัน
- โทร
main()
การทำงาน. { เป็นจุดเริ่มต้นของส่วนเนื้อหาของmain()
ฟังก์ชัน - สร้างแผนที่ชื่อ my_map ซึ่งคีย์จะเป็นสตริงและค่าจำนวนเต็ม
- ใส่ค่าลงในแผนที่ my_map คีย์ Cow และค่า 1 จะถูกแทรกลงในแผนที่
- ใส่ค่าลงในแผนที่ my_map คีย์ Cat และค่า 2 จะถูกแทรกลงในแผนที่
- เพิ่มค่า 3 ลงในแผนที่ my_map ด้วยกุญแจรูปสิงโต
- สร้างตัววนซ้ำเพื่อวนซ้ำบนแผนที่ my_map เพื่อค้นหาคีย์ cat
- ลบองค์ประกอบที่ตัววนซ้ำชี้ไป
- ใช้ตัววนซ้ำเพื่อวนซ้ำองค์ประกอบของแผนที่ my_map ตั้งแต่ต้นจนจบ
- พิมพ์เนื้อหาของแผนที่ my_map บนคอนโซล
- โปรแกรมจะต้องส่งคืนเอาต์พุตเมื่อเสร็จสิ้นสำเร็จ
- ส่วนปลายของลำตัว
main()
ฟังก์ชัน
สรุป
- แผนที่เป็นคอนเทนเนอร์ที่เชื่อมโยงซึ่งจัดเก็บรายการต่างๆ ในรูปแบบที่แมป
- แต่ละรายการในแผนที่มีค่าคีย์และค่าที่แมป
- ในแผนที่ ค่าที่แมปสองค่าไม่สามารถใช้ค่าคีย์ร่วมกันได้
- ค่าคีย์ช่วยในการเรียงลำดับและระบุองค์ประกอบที่ไม่ซ้ำกัน
- ค่าที่แมปช่วยในการจัดเก็บเนื้อหาที่เกี่ยวข้องกับคีย์
- C++ แผนที่จัดเก็บคีย์ที่ไม่ซ้ำตามลำดับการจัดเรียง
- ในการทำงานกับ C++ map เราสร้างตัววนซ้ำเพื่อวนซ้ำองค์ประกอบต่างๆ
- ด้วยตัววนซ้ำเราสามารถดำเนินการงานต่างๆ เช่น การค้นหาและลบรายการออกจากแผนที่ได้