欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

c++中的set容器介紹及操作大全

 更新時間:2025年06月24日 11:42:05   作者:進擊的編程浪人  
這篇文章主要介紹了c++中的set容器介紹及操作大全,本文通過實例代碼給大家介紹的非常詳細,對大家的學習或工作具有一定的參考借鑒價值,需要的朋友參考下吧

??一、核心特性??

??唯一性與自動排序??
std::set存儲的元素??唯一且默認升序排列??(通過std::less實現)。插入重復元素會被自動忽略:

set<int> s = {3, 1, 2, 2}; // 實際存儲 {1, 2, 3}
  • ??底層實現??:紅黑樹(自平衡二叉搜索樹),保證插入、刪除、查找的??時間復雜度為O(log n)??

??元素不可修改??
元素值即鍵(Key),修改會破壞紅黑樹結構。迭代器類型為const_iterator,禁止寫操作:

auto it = s.find(2);
*it = 4; // 編譯錯誤!元素不可直接修改
  • 修改的正確姿勢??:先刪除舊值,再插入新值
  1. ??無隨機訪問??
    不支持operator[]或下標訪問,遍歷??必須依賴迭代器??(雙向迭代器,僅支持++/--

??? ??二、基本操作??

??1. 初始化與賦值??

??方式????示例??
默認構造set<int> s;
初始化列表set<int> s = {1, 3, 2}; → {1, 2, 3}
迭代器范圍初始化vector<int> v{5,4,3}; set<int> s(v.begin(), v.end());
自定義排序規(guī)則set<int, greater<int>> s;(降序)

4

12

??2. 增刪查操作??

??操作????函數????示例????返回值??
插入元素insert(value)s.insert(4);pair<iter, bool>(成功時bool=true
刪除元素erase(key) / erase(iter)s.erase(3); 或 s.erase(s.begin());返回被刪元素后的迭代器
查找元素find(key)auto it = s.find(2);找到返回迭代器,否則返回s.end()
統計元素存在性count(key)if (s.count(2)) { ... }01(因元素唯一)

1

9

??3. 遍歷方式??

// 迭代器遍歷
for (auto it = s.begin(); it != s.end(); ++it) {
    cout << *it << " ";
}
// 范圍循環(huán)(C++11)
for (int val : s) {
    cout << val << " ";
}

?? ??三、高級操作??

??1. 自定義排序規(guī)則??

通過函數對象或Lambda實現復雜排序:

struct CaseInsensitiveCompare {
    bool operator()(const string& a, const string& b) const {
        return tolower(a[0]) < tolower(b[0]); // 首字母不區(qū)分大小寫
    }
};
set<string, CaseInsensitiveCompare> s;

??2. 范圍查詢(lower_bound / upper_bound)??

set<int> s = {10, 20, 30, 40};
auto low = s.lower_bound(20); // 首個 ≥20 的元素 → 20
auto high = s.upper_bound(30); // 首個 >30 的元素 → 40
  • ??應用場景??:快速定位有序數據中的區(qū)間

??3. 結構體存儲??

需重載operator<

struct Person {
    string name;
    int age;
    bool operator<(const Person& p) const { 
        return age < p.age; // 按年齡升序
    }
};
set<Person> s = {{"Alice", 30}, {"Bob", 25}};

?? ??四、性能對比:set vs vector??

??操作??setvector??適用場景??
??插入/刪除??O(log n)(任意位置)O(n)(非尾部操作)頻繁中間插入/刪除 → ??選set??
??查找??O(log n)(二分查找)O(n)(線性遍歷)高頻查找 → ??選set??
??隨機訪問??? 不支持? O(1)按索引訪問 → ??選vector??
??內存占用??較高(樹節(jié)點開銷)較低(連續(xù)內存)內存敏感 → ??選vector??
??元素順序??自動排序插入順序需有序 → ??選set??

?? ??關鍵結論??:

  • ??唯一性+有序性??需求優(yōu)先選set
  • ?隨機訪問+連續(xù)存儲??需求優(yōu)先選vector

?? ??五、典型應用場景??

??數據去重與排序??
從重復數據中提取唯一有序序列:

vector<int> data = {5, 3, 5, 2, 1};
set<int> unique_sorted(data.begin(), data.end()); // {1, 2, 3, 5}

??高效存在性檢查??
黑名單/白名單快速過濾:

set<string> blacklist = {"user1", "user2"};
if (blacklist.find(input_user) != blacklist.end()) block_user();

??范圍統計與區(qū)間查詢??
成績分級、區(qū)間數據分析:

set<int> scores = {60, 75, 85, 90};
auto pass = scores.lower_bound(60); // ≥60的第一個元素

?? ??六、避坑指南??

  • ??迭代器失效問題??

刪除元素時,??僅被刪元素的迭代器失效??,其他迭代器仍有效。

  • ??無法修改元素值??

“修改”需先刪除再插入:

auto it = s.find(old_val);
if (it != s.end()) {
    s.erase(it);
    s.insert(new_val); // 安全修改
}
  • ??自定義類型必須重載operator<??
  • 否則編譯失?。t黑樹需比較規(guī)則)。

?? ??總結??

  • ??核心優(yōu)勢??:自動去重、有序存儲、O(log n)高效操作;
  • ??核心局限??:無隨機訪問、內存開銷較高;
  • ??替代方案??:
    • 需重復元素 → multiset;
    • 需O(1)查找 → unordered_set(哈希表實現,無序)。

到此這篇關于c++中的set容器介紹及操作大全的文章就介紹到這了,更多相關c++ set容器內容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!

相關文章

  • VC實現A進程窗口嵌入到B進程窗口中顯示的方法

    VC實現A進程窗口嵌入到B進程窗口中顯示的方法

    這篇文章主要介紹了VC實現A進程窗口嵌入到B進程窗口中顯示的方法,對于理解windows程序運行原理的進程問題有一定的幫助,需要的朋友可以參考下
    2014-07-07
  • C語言中volatile關鍵字的作用與使用案例教程

    C語言中volatile關鍵字的作用與使用案例教程

    這篇文章主要介紹了C語言中volatile關鍵字的作用與使用案例教程,本篇文章通過簡要的案例,講解了該項技術的了解與使用,以下就是本文的詳細內容,需要的朋友可以參考下
    2021-07-07
  • OpenCV實現簡單攝像頭視頻監(jiān)控程序

    OpenCV實現簡單攝像頭視頻監(jiān)控程序

    這篇文章主要為大家詳細介紹了OpenCV實現簡單攝像頭視頻監(jiān)控程序,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2019-08-08
  • C++實現學生成績管理系統

    C++實現學生成績管理系統

    這篇文章主要為大家詳細介紹了C++實現學生成績管理系統,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2020-12-12
  • 使用Qt封裝一個發(fā)送http請求通用類

    使用Qt封裝一個發(fā)送http請求通用類

    這篇文章主要為大家詳細介紹了如何使用Qt封裝一個通用類,可以通過QNetworkRequest和QNetworkReply進行http請求,感興趣的可以了解一下
    2024-12-12
  • C/C++中字符串流詳解及其作用介紹

    C/C++中字符串流詳解及其作用介紹

    這篇文章主要介紹了C/C++中字符串流詳解及其作用,本文給大家介紹的非常詳細,對大家的學習或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2021-09-09
  • C++開發(fā)之PugiXML庫基礎用法示例詳解

    C++開發(fā)之PugiXML庫基礎用法示例詳解

    PugiXML庫是一個功能強大、簡單易用的C++ XML解析庫,它提供了一組方便的函數來解析、創(chuàng)建和修改XML文檔,本文介紹了如何使用PugiXML庫來解析、創(chuàng)建和修改XML文檔,以及如何處理錯誤和異常,感興趣的朋友跟隨小編一起看看吧
    2024-03-03
  • C語言實現簡易學生成績管理系統

    C語言實現簡易學生成績管理系統

    這篇文章主要為大家詳細介紹了C語言實現簡易學生成績管理系統,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2020-12-12
  • 使用C語言生成圖片的base64編碼的代碼實現

    使用C語言生成圖片的base64編碼的代碼實現

    Base64編碼是一種廣泛使用的編碼方案,將任意二進制數據轉換為可打印的ASCII字符字符串,在實際應用中,Base64編碼常見于電子郵件附件、數據庫中存儲非文本數據等多種場景,本文將給大家介紹使用C語言生成圖片的base64編碼的代碼實現,需要的朋友可以參考下
    2024-08-08
  • C++超詳細講解構造函數與析構函數的用法及實現

    C++超詳細講解構造函數與析構函數的用法及實現

    構造函數主要作用在于創(chuàng)建對象時為對象的成員屬性賦值,構造函數由編譯器自動調用,無須手動調用;析構函數主要作用在于對象銷毀前系統自動調用,執(zhí)行一?些清理工作
    2022-05-05

最新評論