0Pricing
C++ Academy · บทเรียน

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 ในทันที — ไม่ต้องติดตั้งในเครื่องของคุณ

บทเรียนทั้งหมดในหลักสูตรนี้

  1. std::unordered_map
  2. unordered_set
  3. ฟังก์ชันแฮชแบบกำหนดเอง
  4. ข้อควรพิจารณาด้านประสิทธิภาพ
← กลับไปที่ C++ Academy