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

multimap และ multiset

อนุญาตให้มีคีย์ซ้ำ

multimap และ multiset เป็นบทเรียน C++ Academy ฟรีบน CoddyKit นี่คือบทเรียนที่ 3 จากทั้งหมด 4 บทเรียน คุณสามารถอ่านบทเรียนทั้งหมดด้านล่างฟรี — จากนั้นลองปฏิบัติด้วยตัวคุณเองในเบราว์เซอร์พร้อมตัวแก้ไขโค้ดในตัวและติวเตอร์ AI ตลอด 24/7 บทเรียนนี้เป็นส่วนหนึ่งของเส้นทางการเรียน C++ Academy และความก้าวหน้าของคุณจะซิงค์ข้ามเว็บและแอป CoddyKit คอร์ส C++ Academy มีบทเรียนทั้งหมด 4 บทเรียน

การอนุญาตให้มีค่าซ้ำ

std::multimap และ std::multiset คล้ายกับ map และ set แต่ อนุญาตให้มีคีย์ซ้ำ โดยทุกอย่างยังคงเรียงลำดับ

#include <iostream>
#include <set>

int main() {
    std::multiset<int> ms{1, 2, 2, 3, 3, 3};
    for (int x : ms) std::cout << x << ' ';
    std::cout << '\n';
    return 0;
}

การแทรกข้อมูลใน multiset

การเรียก insert() แต่ละครั้งกับ multiset จะสำเร็จ แม้เป็นค่าที่ซ้ำกัน ทำให้คอนเทนเนอร์มีขนาดเพิ่มขึ้นทุกครั้ง

#include <iostream>
#include <set>

int main() {
    std::multiset<std::string> ms;
    ms.insert("a");
    ms.insert("a");
    ms.insert("a");
    std::cout << ms.size() << " elements\n";
    return 0;
}

การนับค่าซ้ำ

ตอนนี้ count() จะคืนค่าจำนวนครั้งที่ค่าหนึ่งปรากฏ ซึ่งอาจมากกว่า 1

#include <iostream>
#include <set>

int main() {
    std::multiset<int> ms{5, 5, 5, 7, 9, 9};
    std::cout << "5 appears " << ms.count(5) << " times\n";
    std::cout << "9 appears " << ms.count(9) << " times\n";
    return 0;
}

การลบทั้งหมดเทียบกับการลบทีละรายการ

erase(key) จะลบองค์ประกอบที่ตรงกัน ทุกองค์ประกอบ หากต้องการลบเพียงรายการเดียว ให้ลบตัววนซ้ำหนึ่งตัวที่ได้จาก find()

#include <iostream>
#include <set>

int main() {
    std::multiset<int> ms{1, 2, 2, 2, 3};
    ms.erase(ms.find(2));
    std::cout << "count of 2: " << ms.count(2) << '\n';
    return 0;
}

พื้นฐานของ multimap

std::multimap จับคู่คีย์กับค่า แต่อนุญาตให้คีย์หนึ่งจับคู่กับหลายค่าได้ โปรดสังเกตว่าไม่มี operator[]

#include <iostream>
#include <map>

int main() {
    std::multimap<std::string, int> mm;
    mm.insert({"fruit", 1});
    mm.insert({"fruit", 2});
    mm.insert({"veg", 3});
    std::cout << mm.size() << " pairs\n";
    return 0;
}

การวนดูข้อมูลใน multimap

การวนดูข้อมูลจะให้คู่ข้อมูลทั้งหมดตามลำดับคีย์ที่เรียงไว้ รวมถึงคีย์ที่ซ้ำกัน

#include <iostream>
#include <map>

int main() {
    std::multimap<std::string, int> mm{{"a", 1}, {"a", 2}, {"b", 3}};
    for (const auto& [k, v] : mm) {
        std::cout << k << " => " << v << '\n';
    }
    return 0;
}

equal_range

equal_range(key) จะคืนค่าคู่ของตัววนซ้ำที่ครอบคลุมองค์ประกอบทั้งหมดซึ่งมีคีย์ดังกล่าว เป็นวิธีมาตรฐานในการอ่านค่าทุกค่าของคีย์หนึ่ง

#include <iostream>
#include <map>

int main() {
    std::multimap<std::string, int> mm{{"x", 10}, {"x", 20}, {"y", 30}};
    auto range = mm.equal_range("x");
    for (auto it = range.first; it != range.second; ++it) {
        std::cout << it->second << ' ';
    }
    std::cout << '\n';
    return 0;
}

การจัดกลุ่มข้อมูล

multimap เหมาะอย่างยิ่งสำหรับการจัดกลุ่ม เช่น หลายคนสามารถอยู่ในเมืองเดียวกันได้

#include <iostream>
#include <map>

int main() {
    std::multimap<std::string, std::string> byCity{
        {"NYC", "Alice"}, {"NYC", "Bob"}, {"LA", "Carol"}
    };
    auto r = byCity.equal_range("NYC");
    for (auto it = r.first; it != r.second; ++it)
        std::cout << it->second << '\n';
    return 0;
}

การใช้ lower_bound กับ multiset

การสอบถามช่วงข้อมูลแบบมีลำดับยังคงใช้งานได้ lower_bound จะค้นหาองค์ประกอบแรกที่ไม่ได้น้อยกว่าเป้าหมาย

#include <iostream>
#include <set>

int main() {
    std::multiset<int> ms{1, 2, 2, 3, 4};
    auto it = ms.lower_bound(2);
    std::cout << "first >= 2 is " << *it << '\n';
    return 0;
}

รายการความถี่ที่เรียงลำดับ

เนื่องจากองค์ประกอบยังคงเรียงลำดับอยู่ multiset จึงสร้างผลลัพธ์ที่เรียงลำดับโดยคงค่าที่ซ้ำกันไว้ได้โดยอัตโนมัติ

#include <iostream>
#include <set>

int main() {
    std::multiset<int> scores{90, 75, 90, 60, 75, 90};
    for (int s : scores) std::cout << s << ' ';
    std::cout << '\n';
    return 0;
}

จำนวนทั้งหมดเทียบกับค่าที่ไม่ซ้ำ

size() จะนับองค์ประกอบทุกตัวรวมถึงค่าซ้ำ ส่วนการวนดูคีย์ที่ไม่ซ้ำกัน คุณต้องข้ามค่าที่ซ้ำด้วยตนเอง

#include <iostream>
#include <set>

int main() {
    std::multiset<int> ms{1, 1, 2, 3, 3};
    std::cout << "total: " << ms.size() << '\n';
    std::cout << "count of 1: " << ms.count(1) << '\n';
    return 0;
}

ตรวจสอบความเข้าใจอย่างรวดเร็ว

ทดสอบความเข้าใจของคุณเกี่ยวกับการลบข้อมูลจาก multiset

สรุป

คุณได้เรียนรู้ว่า multimap และ multiset:

  • อนุญาตให้มีคีย์ซ้ำ พร้อมคงลำดับการเรียงไว้
  • ใช้ equal_range เพื่ออ่านค่าทั้งหมดที่ใช้คีย์ร่วมกัน
  • ให้ erase(key) ลบรายการที่ตรงกัน ทั้งหมด ขณะที่การลบตัววนซ้ำจะลบเพียงรายการเดียว

บทถัดไป คุณจะควบคุมลำดับการเรียงด้วย ตัวเปรียบเทียบแบบกำหนดเอง

คำถามที่พบบ่อย

บทเรียน “multimap และ multiset” ฟรีหรือไม่

ใช่ — ข้อความเต็มของ “multimap และ multiset” ฟรีให้อ่านที่นี่บนเว็บ เพื่อปฏิบัติแบบโต้ตอบ (ตัวแก้ไขโค้ดในตัวและติวเตอร์ AI ตลอด 24/7) และปลดล็อคส่วนที่เหลือของคอร์ส C++ Academy ให้อัปเกรดเป็น CoddyKit PRO คอร์ส C++ Academy มีบทเรียนทั้งหมด 4 บทเรียน

คุณจะเรียนรู้อะไรในบทเรียน “multimap และ multiset”

อนุญาตให้มีคีย์ซ้ำ คุณปฏิบัติ C++ Academy ด้วยโค้ดที่ใช้งานได้จริงที่คุณเรียกใช้โดยตรงในเบราว์เซอร์ และติวเตอร์ AI ตลอด 24/7 ตอบคำถามของคุณขณะที่คุณไปผ่านบทเรียน

คุณต้องมีประสบการณ์ก่อนที่จะเริ่มเรียน C++ Academy หรือไม่

ไม่จำเป็นต้องมีประสบการณ์มาก่อน C++ Academy บน CoddyKit ออกแบบมาสำหรับผู้เริ่มต้นไปจนถึงผู้เรียนขั้นสูง คุณสามารถเริ่มต้นที่นี่หรือเริ่มจากตัวแรกและเรียนด้วยความเร็วของคุณเอง นี่คือบทเรียนที่ 3 จากทั้งหมด 4 บทเรียน

บทเรียน “multimap และ multiset” ใช้เวลานานแค่ไหน

บทเรียน CoddyKit ส่วนใหญ่ใช้เวลาประมาณ 5–10 นาที แต่ละบทเรียนจึงสั้นและเป็นแบบโต้ตอบ คุณสามารถก้าวหน้าอย่างต่อเนื่องและกลับมาเรียนต่อจากตรงที่เพิ่งหยุดบนเว็บและแอปได้เลย

ฉันเขียนและรันโค้ดในบทเรียน C++ Academy นี้ได้ไหม

ได้ บทเรียน C++ Academy ทุกบทมีตัวแก้ไขโค้ดในตัว คุณจึงเขียนและรันโค้ดจริงได้เลยในเบราว์เซอร์ และได้รับข้อเสนอแนะจาก AI ในทันที — ไม่ต้องติดตั้งในเครื่องของคุณ

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

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