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

std::set

องค์ประกอบไม่ซ้ำแบบเรียงลำดับ

บทเรียน 2 จาก 413 ขั้นตอน

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

std::set คืออะไร

std::set จัดเก็บองค์ประกอบที่ไม่ซ้ำกันตามลำดับที่เรียงแล้ว จะไม่มีค่าซ้ำ และการค้นหาทำงานด้วยเวลาแบบลอการิทึม

  • คีย์ก็คือค่าเช่นกัน
  • เหมาะสำหรับการตรวจสอบการมีสมาชิกและการกำจัดค่าซ้ำ
#include <iostream>
#include <set>

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

การแทรกค่า

ใช้ insert() เพื่อเพิ่มองค์ประกอบ การแทรกค่าที่มีอยู่แล้วจะถูกละเว้นโดยอัตโนมัติ

#include <iostream>
#include <set>

int main() {
    std::set<std::string> s;
    s.insert("apple");
    s.insert("banana");
    s.insert("apple");
    std::cout << s.size() << " unique items\n";
    return 0;
}

ค่าที่คืนจากการแทรก

insert() คืนค่าเป็น pair ซึ่ง .second เป็นค่า bool ที่บอกว่าการแทรกเกิดขึ้นจริงหรือไม่

#include <iostream>
#include <set>

int main() {
    std::set<int> s{1, 2};
    auto r = s.insert(2);
    std::cout << std::boolalpha << "inserted: " << r.second << '\n';
    auto r2 = s.insert(5);
    std::cout << "inserted: " << r2.second << '\n';
    return 0;
}

การตรวจสอบสมาชิก

ใช้ count() หรือ contains() ใน C++20 เพื่อตรวจสอบว่ามีค่านั้นอยู่หรือไม่

#include <iostream>
#include <set>

int main() {
    std::set<int> s{10, 20, 30};
    std::cout << s.count(20) << '\n';
    std::cout << s.count(99) << '\n';
    return 0;
}

การค้นหาองค์ประกอบ

find() คืนตัววนซ้ำไปยังองค์ประกอบที่ตรงกัน หรือคืน end() เมื่อไม่พบ

#include <iostream>
#include <set>

int main() {
    std::set<std::string> s{"red", "green", "blue"};
    auto it = s.find("green");
    std::cout << (it != s.end() ? "found" : "missing") << '\n';
    return 0;
}

การลบองค์ประกอบ

erase() ลบค่าด้วยคีย์และคืนจำนวนค่าที่ถูกลบ (0 หรือ 1)

#include <iostream>
#include <set>

int main() {
    std::set<int> s{1, 2, 3, 4};
    s.erase(3);
    for (int x : s) std::cout << x << ' ';
    std::cout << '\n';
    return 0;
}

ลำดับที่เรียงแล้ว

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

#include <iostream>
#include <set>

int main() {
    std::set<int> s{50, 10, 40, 20, 30};
    for (int x : s) std::cout << x << ' ';
    std::cout << '\n';
    return 0;
}

การกำจัดข้อมูลซ้ำ

การป้อนค่าเข้า set เป็นวิธีที่รวดเร็วในการกำจัดค่าซ้ำและเรียงลำดับไปพร้อมกัน

#include <iostream>
#include <set>
#include <vector>

int main() {
    std::vector<int> v{4, 2, 4, 1, 2, 3, 1};
    std::set<int> unique(v.begin(), v.end());
    for (int x : unique) std::cout << x << ' ';
    std::cout << '\n';
    return 0;
}

lower_bound และ upper_bound

เนื่องจาก set มีการเรียงลำดับ lower_bound() และ upper_bound() จึงช่วยให้ค้นหาช่วงข้อมูลได้อย่างมีประสิทธิภาพ

#include <iostream>
#include <set>

int main() {
    std::set<int> s{10, 20, 30, 40, 50};
    auto lo = s.lower_bound(20);
    auto hi = s.upper_bound(40);
    for (auto it = lo; it != hi; ++it) std::cout << *it << ' ';
    std::cout << '\n';
    return 0;
}

ขนาดและการล้างข้อมูล

size() รายงานจำนวนองค์ประกอบ empty() ตรวจสอบว่าไม่มีองค์ประกอบ และ clear() ลบทุกอย่าง

#include <iostream>
#include <set>

int main() {
    std::set<int> s{1, 2, 3};
    std::cout << s.size() << '\n';
    s.clear();
    std::cout << std::boolalpha << s.empty() << '\n';
    return 0;
}

การแทรกช่วงข้อมูล

คุณสามารถแทรกช่วงข้อมูลทั้งหมดจากคอนเทนเนอร์อื่นได้ โดยระบบจะกำจัดค่าซ้ำและเรียงลำดับให้โดยอัตโนมัติ

#include <iostream>
#include <set>

int main() {
    std::set<int> s{1, 2, 3};
    int more[] = {3, 4, 5};
    s.insert(more, more + 3);
    for (int x : s) std::cout << x << ' ';
    std::cout << '\n';
    return 0;
}

ตรวจสอบความเข้าใจ

ทดสอบความเข้าใจเกี่ยวกับการทำงานของ std::set

สรุปทบทวน

คุณได้เรียนรู้ว่า std::set:

  • เก็บค่าที่ไม่ซ้ำและเรียงลำดับแล้ว
  • ละเว้นการแทรกค่าซ้ำโดยไม่มีการแจ้งเตือน
  • รองรับการค้นหาด้วย find, count, erase และการค้นหาช่วงแบบมีลำดับด้วย lower_bound/upper_bound

ถัดไป คุณจะได้รู้จัก multimap และ multiset ซึ่งอนุญาตให้มีค่าซ้ำได้

เริ่มต้นได้ฟรี

เรียนรู้ C++ ด้วย AI tutor — ฟรี

เขียนและเรียกใช้โค้ดจริงในเบราว์เซอร์ของคุณ รับความช่วยเหลือทันทีจาก AI tutor 24/7 และเรียนรู้ต่อจากที่คุณหยุดบนเว็บหรือในแอป

คอร์ส
51
บทเรียน
203

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

บทเรียน “std::set” ฟรีหรือไม่

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

คุณจะเรียนรู้อะไรในบทเรียน “std::set”

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

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

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

บทเรียน “std::set” ใช้เวลานานแค่ไหน

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

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

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

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

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