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

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

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

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