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

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

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

  1. std::map
  2. std::set
  3. multimap และ multiset
  4. ตัวเปรียบเทียบแบบกำหนดเอง
← กลับไปที่ C++ Academy