首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> C語言 >> 關於C語言

C++ STL set 容器詳解:插入、遍歷、查找與返回值判斷

     編輯:關於C語言

set 簡介

std::set 是關聯式容器,內部以紅黑樹實現,元素自動排序且唯一(無重複)。

核心操作

1. 插入元素 insert()

返回 pair<iterator, bool>:

  • second 為 true 表示插入成功(原無該值)。
  • second 為 false 表示已存在,first 指向現有元素。

2. 遍歷

使用迭代器:

[cpp]
for (auto it = s.begin(); it != s.end(); ++it)
    cout << *it << ' ';

3. 查找 find() / count()

  • find(val) 返回迭代器,若不存在則返回 end()。
  • count(val) 返回 0 或 1(因元素唯一)。

完整示例代碼

[cpp]
#include <iostream>
#include <string>
#include <set>
using namespace std;

void printSet(const set& s) {
    for (int val : s) cout << val << ' ';
    cout << '\n';
}

int main() {
    set s1;
    for (int i = 0; i < 5; ++i) s1.insert(i * 10); // 0 10 20 30 40
    printSet(s1);

    // 嘗試插入重複值 20
    cout << "s1.insert(20).second = " << s1.insert(20).second << '\n'; // 0
    if (s1.insert(20).second) cout << "Insert OK!\n";
    else cout << "Insert Failed!\n"; // 輸出此行

    // 插入新值 50
    cout << "s1.insert(50).second = " << s1.insert(50).second << '\n'; // 1
    if (s1.insert(50).second) {
        cout << "Insert OK!\n";
        printSet(s1); // 0 10 20 30 40 50
    } else cout << "Insert Failed!\n";

    // 使用 pair 接收返回值
    pair::iterator, bool> p = s1.insert(60);
    if (p.second) {
        cout << "Insert OK!\n";
        printSet(s1); // 0 10 20 30 40 50 60
    } else cout << "Insert Failed!\n";

    return 0;
}

常見錯誤修正

原文中的遍歷寫法 for(i=s.begin(); i>=s.end(); i++) 有誤,正確為 i != s.end()。

總結

  • set 適合「唯一、有序、頻繁查找」場景。
  • 插入、刪除、查找時間複雜度均為 O(log n)。
  • 善用 insert 返回值判斷是否真正插入。
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved