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 ในทันที — ไม่ต้องติดตั้งในเครื่องของคุณ
บทเรียนทั้งหมดในหลักสูตรนี้
- std::map
- std::set
- multimap และ multiset
- ตัวเปรียบเทียบแบบกำหนดเอง