unordered_set
องค์ประกอบไม่ซ้ำแบบใช้แฮช
unordered_set เป็นบทเรียน C++ Academy ฟรีบน CoddyKit นี่คือบทเรียนที่ 2 จากทั้งหมด 4 บทเรียน คุณสามารถอ่านบทเรียนทั้งหมดด้านล่างฟรี — จากนั้นลองปฏิบัติด้วยตัวคุณเองในเบราว์เซอร์พร้อมตัวแก้ไขโค้ดในตัวและติวเตอร์ AI ตลอด 24/7 บทเรียนนี้เป็นส่วนหนึ่งของเส้นทางการเรียน C++ Academy และความก้าวหน้าของคุณจะซิงค์ข้ามเว็บและแอป CoddyKit คอร์ส C++ Academy มีบทเรียนทั้งหมด 4 บทเรียน
unordered_set คืออะไร
std::unordered_set จัดเก็บ องค์ประกอบที่ไม่ซ้ำกัน ในตาราง hash การทดสอบการเป็นสมาชิกใช้เวลาคงที่โดยเฉลี่ย แต่จะ ไม่มีลำดับการเรียง
#include <iostream>
#include <unordered_set>
int main() {
std::unordered_set<int> s{1, 2, 3, 2, 1};
std::cout << s.size() << " unique values\n";
return 0;
}set เทียบกับ unordered_set
เช่นเดียวกับ map:
set: มีการเรียงลำดับ ใช้เวลา O(log n)unordered_set: ไม่มีลำดับ ใช้เวลา O(1) โดยเฉลี่ย
เลือกใช้ unordered_set เมื่อต้องการตรวจสอบการเป็นสมาชิกที่รวดเร็วที่สุด
#include <iostream>
#include <unordered_set>
int main() {
std::unordered_set<std::string> seen{"a", "b", "c"};
std::cout << (seen.count("b") ? "yes" : "no") << '\n';
return 0;
}การแทรกค่า
insert() จะเพิ่มองค์ประกอบ หากมีองค์ประกอบนั้นอยู่แล้วก็จะไม่ทำอะไร และคืนค่าคู่ข้อมูลที่ .second ระบุว่าเพิ่มองค์ประกอบสำเร็จหรือไม่
#include <iostream>
#include <unordered_set>
int main() {
std::unordered_set<int> s;
auto a = s.insert(5);
auto b = s.insert(5);
std::cout << std::boolalpha << a.second << ' ' << b.second << '\n';
return 0;
}การตรวจสอบการเป็นสมาชิกอย่างรวดเร็ว
การตรวจสอบว่าเคยพบค่าหนึ่งแล้วหรือไม่เป็นกรณีใช้งานพื้นฐานที่สำคัญ count() จะคืนค่า 0 หรือ 1
#include <iostream>
#include <unordered_set>
int main() {
std::unordered_set<std::string> blocked{"spam", "junk"};
std::cout << blocked.count("spam") << '\n';
std::cout << blocked.count("ok") << '\n';
return 0;
}การลบองค์ประกอบ
erase() จะลบค่าและคืนค่าจำนวนรายการที่ถูกลบ (0 หรือ 1)
#include <iostream>
#include <unordered_set>
int main() {
std::unordered_set<int> s{1, 2, 3};
s.erase(2);
std::cout << "count 2: " << s.count(2) << '\n';
std::cout << "size: " << s.size() << '\n';
return 0;
}การตรวจจับค่าซ้ำ
คุณสามารถตรวจจับค่าซ้ำตัวแรกในลำดับข้อมูลได้โดยการแทรกข้อมูลแล้วตรวจสอบผลลัพธ์แบบบูลีน
#include <iostream>
#include <unordered_set>
int main() {
int data[] = {3, 7, 1, 7, 9};
std::unordered_set<int> seen;
for (int x : data) {
if (!seen.insert(x).second) {
std::cout << "first duplicate: " << x << '\n';
break;
}
}
return 0;
}การวนดูข้อมูล
การวนดูข้อมูลทำได้ แต่ลำดับนั้น ไม่ได้กำหนดไว้ ให้รวมค่าหรือประมวลผลองค์ประกอบโดยไม่ตั้งสมมติฐานเกี่ยวกับลำดับใด ๆ
#include <iostream>
#include <unordered_set>
int main() {
std::unordered_set<int> s{10, 20, 30};
int total = 0;
for (int x : s) total += x;
std::cout << "sum = " << total << '\n';
return 0;
}การลบค่าซ้ำออกจากช่วงข้อมูล
สร้าง unordered_set จากช่วงข้อมูลเพื่อกำจัดค่าซ้ำอย่างรวดเร็ว (โดยไม่คงลำดับเดิมไว้)
#include <iostream>
#include <unordered_set>
#include <vector>
int main() {
std::vector<int> v{1, 2, 2, 3, 3, 3};
std::unordered_set<int> u(v.begin(), v.end());
std::cout << u.size() << " unique\n";
return 0;
}find เทียบกับ count
find() จะให้ตัววนซ้ำไปยังองค์ประกอบ เพื่อให้คุณนำไปใช้งานต่อได้ ส่วน count() เพียงรายงานว่ามีองค์ประกอบนั้นอยู่หรือไม่
#include <iostream>
#include <unordered_set>
int main() {
std::unordered_set<std::string> s{"alpha", "beta"};
auto it = s.find("beta");
std::cout << (it != s.end() ? *it : "none") << '\n';
return 0;
}การล้างข้อมูลและการตรวจสอบว่าง
clear() จะลบองค์ประกอบทั้งหมด และ empty() จะตรวจสอบว่าไม่มีองค์ประกอบหรือไม่
#include <iostream>
#include <unordered_set>
int main() {
std::unordered_set<int> s{1, 2, 3};
s.clear();
std::cout << std::boolalpha << s.empty() << '\n';
return 0;
}ส่วนร่วมของเซต
หากต้องการค้นหาองค์ประกอบที่มีร่วมกัน ให้วนดูเซตหนึ่งแล้วตรวจสอบการเป็นสมาชิกในอีกเซตหนึ่ง
#include <iostream>
#include <unordered_set>
int main() {
std::unordered_set<int> a{1, 2, 3, 4};
std::unordered_set<int> b{3, 4, 5};
for (int x : a) if (b.count(x)) std::cout << x << ' ';
std::cout << '\n';
return 0;
}ตรวจสอบความเข้าใจอย่างรวดเร็ว
ทดสอบความเข้าใจของคุณเกี่ยวกับ unordered_set
สรุป
คุณได้เรียนรู้ว่า std::unordered_set:
- จัดเก็บ องค์ประกอบที่ไม่ซ้ำกัน โดยการดำเนินการใช้เวลา O(1) โดยเฉลี่ย
- มี ลำดับที่ไม่รับประกัน
- เหมาะอย่างยิ่งสำหรับการตรวจสอบการเป็นสมาชิกและการตรวจจับค่าซ้ำอย่างรวดเร็ว
ต่อไป คุณจะเรียนรู้การทำ hash ให้ชนิดข้อมูลที่กำหนดเอง
คำถามที่พบบ่อย
บทเรียน “unordered_set” ฟรีหรือไม่
ใช่ — ข้อความเต็มของ “unordered_set” ฟรีให้อ่านที่นี่บนเว็บ เพื่อปฏิบัติแบบโต้ตอบ (ตัวแก้ไขโค้ดในตัวและติวเตอร์ AI ตลอด 24/7) และปลดล็อคส่วนที่เหลือของคอร์ส C++ Academy ให้อัปเกรดเป็น CoddyKit PRO คอร์ส C++ Academy มีบทเรียนทั้งหมด 4 บทเรียน
คุณจะเรียนรู้อะไรในบทเรียน “unordered_set”
องค์ประกอบไม่ซ้ำแบบใช้แฮช คุณปฏิบัติ C++ Academy ด้วยโค้ดที่ใช้งานได้จริงที่คุณเรียกใช้โดยตรงในเบราว์เซอร์ และติวเตอร์ AI ตลอด 24/7 ตอบคำถามของคุณขณะที่คุณไปผ่านบทเรียน
คุณต้องมีประสบการณ์ก่อนที่จะเริ่มเรียน C++ Academy หรือไม่
ไม่จำเป็นต้องมีประสบการณ์มาก่อน C++ Academy บน CoddyKit ออกแบบมาสำหรับผู้เริ่มต้นไปจนถึงผู้เรียนขั้นสูง คุณสามารถเริ่มต้นที่นี่หรือเริ่มจากตัวแรกและเรียนด้วยความเร็วของคุณเอง นี่คือบทเรียนที่ 2 จากทั้งหมด 4 บทเรียน
บทเรียน “unordered_set” ใช้เวลานานแค่ไหน
บทเรียน CoddyKit ส่วนใหญ่ใช้เวลาประมาณ 5–10 นาที แต่ละบทเรียนจึงสั้นและเป็นแบบโต้ตอบ คุณสามารถก้าวหน้าอย่างต่อเนื่องและกลับมาเรียนต่อจากตรงที่เพิ่งหยุดบนเว็บและแอปได้เลย
ฉันเขียนและรันโค้ดในบทเรียน C++ Academy นี้ได้ไหม
ได้ บทเรียน C++ Academy ทุกบทมีตัวแก้ไขโค้ดในตัว คุณจึงเขียนและรันโค้ดจริงได้เลยในเบราว์เซอร์ และได้รับข้อเสนอแนะจาก AI ในทันที — ไม่ต้องติดตั้งในเครื่องของคุณ