std::map
การจัดเก็บคู่คีย์-ค่าแบบเรียงลำดับ
std::map เป็นบทเรียน C++ Academy ฟรีบน CoddyKit นี่คือบทเรียนที่ 1 จากทั้งหมด 4 บทเรียน คุณสามารถอ่านบทเรียนทั้งหมดด้านล่างฟรี — จากนั้นลองปฏิบัติด้วยตัวคุณเองในเบราว์เซอร์พร้อมตัวแก้ไขโค้ดในตัวและติวเตอร์ AI ตลอด 24/7 บทเรียนนี้เป็นส่วนหนึ่งของเส้นทางการเรียน C++ Academy และความก้าวหน้าของคุณจะซิงค์ข้ามเว็บและแอป CoddyKit คอร์ส C++ Academy มีบทเรียนทั้งหมด 4 บทเรียน
std::map คืออะไร
std::map จัดเก็บคู่คีย์-ค่าโดยเรียงตามคีย์ คีย์แต่ละตัวไม่ซ้ำกัน และการค้นหา การแทรก และการลบทำงานด้วยเวลาแบบลอการิทึม
- คีย์จะถูกเก็บไว้ตามลำดับที่เรียงแล้ว
- ทำงานอยู่บนต้นไม้ค้นหาแบบทวิภาคสมดุล
#include <iostream>
#include <map>
int main() {
std::map<std::string, int> ages;
ages["Alice"] = 30;
ages["Bob"] = 25;
std::cout << "Alice is " << ages["Alice"] << '\n';
return 0;
}การแทรกองค์ประกอบ
คุณสามารถแทรกข้อมูลด้วย operator[], insert() หรือ emplace() การใช้ [] กับคีย์ที่ไม่มีอยู่จะสร้างคีย์นั้นพร้อมค่าเริ่มต้น
#include <iostream>
#include <map>
int main() {
std::map<std::string, int> m;
m["one"] = 1;
m.insert({"two", 2});
m.emplace("three", 3);
std::cout << m.size() << " entries\n";
return 0;
}การวนซ้ำตามลำดับที่เรียงแล้ว
การวนซ้ำผ่าน std::map จะเยี่ยมชมคีย์ตามลำดับจากน้อยไปมาก แต่ละองค์ประกอบเป็น std::pair ที่มี .first (คีย์) และ .second (ค่า)
#include <iostream>
#include <map>
int main() {
std::map<std::string, int> m{{"banana", 3}, {"apple", 5}, {"cherry", 1}};
for (const auto& p : m) {
std::cout << p.first << " = " << p.second << '\n';
}
return 0;
}การค้นหาคีย์
ใช้ find() เพื่อค้นหาคีย์อย่างปลอดภัย ฟังก์ชันจะคืนตัววนซ้ำไปยังองค์ประกอบนั้น หรือคืน end() หากไม่พบ
#include <iostream>
#include <map>
int main() {
std::map<std::string, int> m{{"x", 10}, {"y", 20}};
auto it = m.find("y");
if (it != m.end()) {
std::cout << "Found y = " << it->second << '\n';
} else {
std::cout << "Not found\n";
}
return 0;
}การตรวจสอบการมีอยู่
หากต้องการตรวจสอบว่าคีย์มีอยู่หรือไม่โดยไม่สร้างคีย์ใหม่ ให้ใช้ count() (คืนค่า 0 หรือ 1) หรือใช้ contains() ใน C++20
#include <iostream>
#include <map>
int main() {
std::map<std::string, int> m{{"a", 1}};
std::cout << m.count("a") << '\n';
std::cout << m.count("z") << '\n';
return 0;
}การอัปเดตค่า
การกำหนดค่าให้คีย์เดิมใหม่จะอัปเดตค่าของคีย์นั้นโดยตรง map จะเก็บค่าไว้เพียงหนึ่งค่าต่อหนึ่งคีย์
#include <iostream>
#include <map>
int main() {
std::map<std::string, int> score;
score["player"] = 10;
score["player"] += 5;
std::cout << score["player"] << '\n';
return 0;
}การลบองค์ประกอบ
erase() ลบองค์ประกอบด้วยคีย์หรือตัววนซ้ำ เมื่อส่งคีย์ให้ฟังก์ชัน ฟังก์ชันจะคืนจำนวนองค์ประกอบที่ถูกลบ
#include <iostream>
#include <map>
int main() {
std::map<std::string, int> m{{"a", 1}, {"b", 2}, {"c", 3}};
m.erase("b");
std::cout << m.size() << " left\n";
for (const auto& p : m) std::cout << p.first << ' ';
std::cout << '\n';
return 0;
}การใช้ at()
at() คืนค่าการอ้างอิงไปยังค่าของคีย์ และโยนข้อผิดพลาด std::out_of_range หากไม่พบคีย์ ต่างจาก [] ตรงที่จะไม่แทรกคีย์ใหม่
#include <iostream>
#include <map>
int main() {
std::map<std::string, int> m{{"k", 42}};
std::cout << m.at("k") << '\n';
std::cout << "size: " << m.size() << '\n';
return 0;
}การนับความถี่ของคำ
การใช้งาน std::map แบบคลาสสิกคือการนับจำนวนครั้งที่ปรากฏ ตัวดำเนินการ [] จะกำหนดค่าเริ่มต้นให้คีย์ใหม่เป็น 0 ดังนั้น ++ จึงใช้งานได้ทันที
#include <iostream>
#include <map>
#include <string>
int main() {
std::string words[] = {"cat", "dog", "cat", "bird", "dog", "cat"};
std::map<std::string, int> freq;
for (const auto& w : words) freq[w]++;
for (const auto& p : freq) std::cout << p.first << ": " << p.second << '\n';
return 0;
}การผูกแบบมีโครงสร้าง
C++17 ช่วยให้คุณแยกแต่ละคู่ด้วยการผูกแบบมีโครงสร้าง และตั้งชื่อที่อ่านเข้าใจง่ายให้คีย์กับค่า
#include <iostream>
#include <map>
int main() {
std::map<std::string, int> m{{"red", 1}, {"green", 2}};
for (const auto& [name, value] : m) {
std::cout << name << " -> " << value << '\n';
}
return 0;
}การตรวจสอบว่าว่างหรือไม่
empty() รายงานว่า map ไม่มีองค์ประกอบหรือไม่ และ clear() จะลบทุกอย่างในครั้งเดียว
#include <iostream>
#include <map>
int main() {
std::map<int, int> m{{1, 1}, {2, 4}};
std::cout << std::boolalpha << m.empty() << '\n';
m.clear();
std::cout << m.empty() << '\n';
return 0;
}ตรวจสอบความเข้าใจ
ทดสอบความเข้าใจเกี่ยวกับการเรียงลำดับของ std::map
สรุปทบทวน
คุณได้เรียนรู้ว่า std::map:
- จัดเก็บคีย์ที่ไม่ซ้ำและเรียงลำดับแล้วซึ่งเชื่อมโยงกับค่า
- รองรับ
insert,[],find,count,atและerase - วนซ้ำตามลำดับคีย์จากน้อยไปมากพร้อมคู่ข้อมูลที่สามารถแยกด้วยการผูกแบบมีโครงสร้าง
ถัดไป คุณจะได้รู้จัก std::set สำหรับจัดเก็บเฉพาะค่าที่ไม่ซ้ำและเรียงลำดับแล้ว
คำถามที่พบบ่อย
บทเรียน “std::map” ฟรีหรือไม่
ใช่ — ข้อความเต็มของ “std::map” ฟรีให้อ่านที่นี่บนเว็บ เพื่อปฏิบัติแบบโต้ตอบ (ตัวแก้ไขโค้ดในตัวและติวเตอร์ AI ตลอด 24/7) และปลดล็อคส่วนที่เหลือของคอร์ส C++ Academy ให้อัปเกรดเป็น CoddyKit PRO คอร์ส C++ Academy มีบทเรียนทั้งหมด 4 บทเรียน
คุณจะเรียนรู้อะไรในบทเรียน “std::map”
การจัดเก็บคู่คีย์-ค่าแบบเรียงลำดับ คุณปฏิบัติ C++ Academy ด้วยโค้ดที่ใช้งานได้จริงที่คุณเรียกใช้โดยตรงในเบราว์เซอร์ และติวเตอร์ AI ตลอด 24/7 ตอบคำถามของคุณขณะที่คุณไปผ่านบทเรียน
คุณต้องมีประสบการณ์ก่อนที่จะเริ่มเรียน C++ Academy หรือไม่
ไม่จำเป็นต้องมีประสบการณ์มาก่อน C++ Academy บน CoddyKit ออกแบบมาสำหรับผู้เริ่มต้นไปจนถึงผู้เรียนขั้นสูง คุณสามารถเริ่มต้นที่นี่หรือเริ่มจากตัวแรกและเรียนด้วยความเร็วของคุณเอง นี่คือบทเรียนที่ 1 จากทั้งหมด 4 บทเรียน
บทเรียน “std::map” ใช้เวลานานแค่ไหน
บทเรียน CoddyKit ส่วนใหญ่ใช้เวลาประมาณ 5–10 นาที แต่ละบทเรียนจึงสั้นและเป็นแบบโต้ตอบ คุณสามารถก้าวหน้าอย่างต่อเนื่องและกลับมาเรียนต่อจากตรงที่เพิ่งหยุดบนเว็บและแอปได้เลย
ฉันเขียนและรันโค้ดในบทเรียน C++ Academy นี้ได้ไหม
ได้ บทเรียน C++ Academy ทุกบทมีตัวแก้ไขโค้ดในตัว คุณจึงเขียนและรันโค้ดจริงได้เลยในเบราว์เซอร์ และได้รับข้อเสนอแนะจาก AI ในทันที — ไม่ต้องติดตั้งในเครื่องของคุณ