std::unordered_map
การค้นหาแบบแฮชที่รวดเร็ว
std::unordered_map เป็นบทเรียน C++ Academy ฟรีบน CoddyKit นี่คือบทเรียนที่ 1 จากทั้งหมด 4 บทเรียน คุณสามารถอ่านบทเรียนทั้งหมดด้านล่างฟรี — จากนั้นลองปฏิบัติด้วยตัวคุณเองในเบราว์เซอร์พร้อมตัวแก้ไขโค้ดในตัวและติวเตอร์ AI ตลอด 24/7 บทเรียนนี้เป็นส่วนหนึ่งของเส้นทางการเรียน C++ Academy และความก้าวหน้าของคุณจะซิงค์ข้ามเว็บและแอป CoddyKit คอร์ส C++ Academy มีบทเรียนทั้งหมด 4 บทเรียน
unordered_map คืออะไร
std::unordered_map จัดเก็บคู่คีย์-ค่าใน ตาราง hash การค้นหา การแทรก และการลบโดยเฉลี่ยใช้เวลาคงที่ แต่องค์ประกอบจะ ไม่มีลำดับการเรียง
#include <iostream>
#include <unordered_map>
int main() {
std::unordered_map<std::string, int> ages;
ages["Alice"] = 30;
ages["Bob"] = 25;
std::cout << ages["Alice"] << '\n';
return 0;
}map เทียบกับ unordered_map
เลือกใช้ตามความต้องการ:
map: มีการเรียงลำดับ การดำเนินการใช้เวลา O(log n)unordered_map: ไม่มีลำดับ การดำเนินการโดยเฉลี่ยใช้เวลา O(1)
ใช้ unordered_map เมื่อคุณต้องการเพียงการค้นหาที่รวดเร็ว
#include <iostream>
#include <unordered_map>
int main() {
std::unordered_map<int, std::string> m{{3, "c"}, {1, "a"}, {2, "b"}};
std::cout << m.size() << " entries (order not guaranteed)\n";
return 0;
}การแทรกและการปรับปรุงข้อมูล
มีรูปแบบการเรียกใช้งานเดียวกับ map: ใช้ [], insert() หรือ emplace()
#include <iostream>
#include <unordered_map>
int main() {
std::unordered_map<std::string, int> m;
m["x"] = 1;
m.insert({"y", 2});
m.emplace("z", 3);
std::cout << m.size() << '\n';
return 0;
}การค้นหาด้วย find
find() จะคืนค่าตัววนซ้ำหรือ end() วิธีนี้ช่วยป้องกันการแทรกค่าเริ่มต้นโดยไม่ตั้งใจ ซึ่งอาจเกิดขึ้นเมื่อใช้ []
#include <iostream>
#include <unordered_map>
int main() {
std::unordered_map<std::string, int> m{{"a", 1}};
auto it = m.find("a");
if (it != m.end()) std::cout << it->second << '\n';
std::cout << "size: " << m.size() << '\n';
return 0;
}การตรวจสอบการมีอยู่
count() จะคืนค่า 0 หรือ 1 และ C++20 เพิ่ม contains() สำหรับการตรวจสอบค่าบูลีนที่ชัดเจน
#include <iostream>
#include <unordered_map>
int main() {
std::unordered_map<std::string, int> m{{"key", 99}};
std::cout << m.count("key") << '\n';
std::cout << m.count("missing") << '\n';
return 0;
}การวนดูข้อมูล
คุณสามารถวนดูข้อมูลได้ แต่ลำดับนั้น ไม่ได้กำหนดไว้ อย่าพึ่งพาว่าข้อมูลจะเรียงลำดับหรือเรียงตามลำดับการแทรก
#include <iostream>
#include <unordered_map>
int main() {
std::unordered_map<std::string, int> m{{"a", 1}, {"b", 2}, {"c", 3}};
int total = 0;
for (const auto& [k, v] : m) total += v;
std::cout << "sum = " << total << '\n';
return 0;
}การลบข้อมูล
erase() จะลบข้อมูลตามคีย์และคืนค่าจำนวนรายการที่ถูกลบ
#include <iostream>
#include <unordered_map>
int main() {
std::unordered_map<std::string, int> m{{"a", 1}, {"b", 2}};
m.erase("a");
std::cout << m.count("a") << ' ' << m.size() << '\n';
return 0;
}การนับความถี่อย่างรวดเร็ว
สำหรับชุดข้อมูลขนาดใหญ่ที่ไม่จำเป็นต้องสนใจลำดับ unordered_map จะนับความถี่ได้เร็วกว่า map
#include <iostream>
#include <unordered_map>
#include <string>
int main() {
std::string items[] = {"a", "b", "a", "c", "b", "a"};
std::unordered_map<std::string, int> freq;
for (const auto& s : items) freq[s]++;
std::cout << "a appears " << freq["a"] << " times\n";
return 0;
}การใช้ at()
at() จะคืนค่าการอ้างอิง และแสดงข้อผิดพลาด std::out_of_range เมื่อไม่พบคีย์ โดยจะไม่แทรกคีย์
#include <iostream>
#include <unordered_map>
int main() {
std::unordered_map<std::string, int> m{{"score", 42}};
std::cout << m.at("score") << '\n';
return 0;
}การแทรกค่าเริ่มต้นผ่าน []
การเข้าถึงคีย์ที่ไม่พบด้วย [] จะแทรกคีย์นั้นพร้อมค่าที่เริ่มต้นตามชนิดข้อมูล (สำหรับ int คือ 0) โปรดระวัง เพราะการทำเช่นนี้จะเพิ่มขนาดของ map อย่างเงียบ ๆ
#include <iostream>
#include <unordered_map>
int main() {
std::unordered_map<std::string, int> m;
std::cout << m["new"] << '\n';
std::cout << "size: " << m.size() << '\n';
return 0;
}การล้างข้อมูลใน map
clear() จะล้างข้อมูลทั้งหมดในตาราง และ empty() จะรายงานว่าตารางไม่มีองค์ประกอบหรือไม่
#include <iostream>
#include <unordered_map>
int main() {
std::unordered_map<int, int> m{{1, 1}, {2, 2}};
m.clear();
std::cout << std::boolalpha << m.empty() << '\n';
return 0;
}ตรวจสอบความเข้าใจอย่างรวดเร็ว
ทดสอบความเข้าใจของคุณเกี่ยวกับลำดับของ unordered_map
สรุป
คุณได้เรียนรู้ว่า std::unordered_map:
- ใช้ ตาราง hash เพื่อให้การดำเนินการโดยเฉลี่ยใช้เวลา O(1)
- มี ลำดับที่ไม่รับประกัน
- มีรูปแบบการเรียกใช้งานเดียวกับ
map(find,count,at,erase)
ต่อไป คุณจะรู้จัก unordered_set สำหรับการจัดเก็บองค์ประกอบที่ไม่ซ้ำกันอย่างรวดเร็ว
คำถามที่พบบ่อย
บทเรียน “std::unordered_map” ฟรีหรือไม่
ใช่ — ข้อความเต็มของ “std::unordered_map” ฟรีให้อ่านที่นี่บนเว็บ เพื่อปฏิบัติแบบโต้ตอบ (ตัวแก้ไขโค้ดในตัวและติวเตอร์ AI ตลอด 24/7) และปลดล็อคส่วนที่เหลือของคอร์ส C++ Academy ให้อัปเกรดเป็น CoddyKit PRO คอร์ส C++ Academy มีบทเรียนทั้งหมด 4 บทเรียน
คุณจะเรียนรู้อะไรในบทเรียน “std::unordered_map”
การค้นหาแบบแฮชที่รวดเร็ว คุณปฏิบัติ C++ Academy ด้วยโค้ดที่ใช้งานได้จริงที่คุณเรียกใช้โดยตรงในเบราว์เซอร์ และติวเตอร์ AI ตลอด 24/7 ตอบคำถามของคุณขณะที่คุณไปผ่านบทเรียน
คุณต้องมีประสบการณ์ก่อนที่จะเริ่มเรียน C++ Academy หรือไม่
ไม่จำเป็นต้องมีประสบการณ์มาก่อน C++ Academy บน CoddyKit ออกแบบมาสำหรับผู้เริ่มต้นไปจนถึงผู้เรียนขั้นสูง คุณสามารถเริ่มต้นที่นี่หรือเริ่มจากตัวแรกและเรียนด้วยความเร็วของคุณเอง นี่คือบทเรียนที่ 1 จากทั้งหมด 4 บทเรียน
บทเรียน “std::unordered_map” ใช้เวลานานแค่ไหน
บทเรียน CoddyKit ส่วนใหญ่ใช้เวลาประมาณ 5–10 นาที แต่ละบทเรียนจึงสั้นและเป็นแบบโต้ตอบ คุณสามารถก้าวหน้าอย่างต่อเนื่องและกลับมาเรียนต่อจากตรงที่เพิ่งหยุดบนเว็บและแอปได้เลย
ฉันเขียนและรันโค้ดในบทเรียน C++ Academy นี้ได้ไหม
ได้ บทเรียน C++ Academy ทุกบทมีตัวแก้ไขโค้ดในตัว คุณจึงเขียนและรันโค้ดจริงได้เลยในเบราว์เซอร์ และได้รับข้อเสนอแนะจาก AI ในทันที — ไม่ต้องติดตั้งในเครื่องของคุณ
บทเรียนทั้งหมดในหลักสูตรนี้
- std::unordered_map
- unordered_set
- ฟังก์ชันแฮชแบบกำหนดเอง
- ข้อควรพิจารณาด้านประสิทธิภาพ