最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

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

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

??一、核心特性??

??唯一性與自動(dòng)排序??
std::set存儲(chǔ)的元素??唯一且默認(rèn)升序排列??(通過(guò)std::less實(shí)現(xiàn))。插入重復(fù)元素會(huì)被自動(dòng)忽略:

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

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

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

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

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

??方式????示例??
默認(rèn)構(gòu)造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. 增刪查操作??

??操作????函數(shù)????示例????返回值??
插入元素insert(value)s.insert(4);pair<iter, bool>(成功時(shí)bool=true
刪除元素erase(key) / erase(iter)s.erase(3); 或 s.erase(s.begin());返回被刪元素后的迭代器
查找元素find(key)auto it = s.find(2);找到返回迭代器,否則返回s.end()
統(tǒng)計(jì)元素存在性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 << " ";
}

?? ??三、高級(jí)操作??

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

通過(guò)函數(shù)對(duì)象或Lambda實(shí)現(xiàn)復(fù)雜排序:

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); // 首個(gè) ≥20 的元素 → 20
auto high = s.upper_bound(30); // 首個(gè) >30 的元素 → 40
  • ??應(yīng)用場(chǎng)景??:快速定位有序數(shù)據(jù)中的區(qū)間

??3. 結(jié)構(gòu)體存儲(chǔ)??

需重載operator<

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

?? ??四、性能對(duì)比:set vs vector??

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

?? ??關(guān)鍵結(jié)論??:

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

?? ??五、典型應(yīng)用場(chǎng)景??

??數(shù)據(jù)去重與排序??
從重復(fù)數(shù)據(jù)中提取唯一有序序列:

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

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

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

??范圍統(tǒng)計(jì)與區(qū)間查詢??
成績(jī)分級(jí)、區(qū)間數(shù)據(jù)分析:

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

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

  • ??迭代器失效問(wèn)題??

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

  • ??無(wú)法修改元素值??

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

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

?? ??總結(jié)??

  • ??核心優(yōu)勢(shì)??:自動(dòng)去重、有序存儲(chǔ)、O(log n)高效操作;
  • ??核心局限??:無(wú)隨機(jī)訪問(wèn)、內(nèi)存開銷較高;
  • ??替代方案??:
    • 需重復(fù)元素 → multiset;
    • 需O(1)查找 → unordered_set(哈希表實(shí)現(xiàn),無(wú)序)。

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

相關(guān)文章

  • C/C++?Qt數(shù)據(jù)庫(kù)SqlRelationalTable關(guān)聯(lián)表詳解

    C/C++?Qt數(shù)據(jù)庫(kù)SqlRelationalTable關(guān)聯(lián)表詳解

    這篇文章主要介紹了QT中SqlRelationalTable關(guān)聯(lián)表組件的使用,文中代碼對(duì)我們的學(xué)習(xí)和工作具有一定價(jià)值,感興趣的朋友可以了解一下
    2021-12-12
  • C++動(dòng)態(tài)加載so/dll庫(kù)的實(shí)現(xiàn)

    C++動(dòng)態(tài)加載so/dll庫(kù)的實(shí)現(xiàn)

    本文主要介紹了C++動(dòng)態(tài)加載so/dll庫(kù)的實(shí)現(xiàn),文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2023-07-07
  • 詳解C++編程中的sizeof運(yùn)算符與typeid運(yùn)算符

    詳解C++編程中的sizeof運(yùn)算符與typeid運(yùn)算符

    這篇文章主要介紹了C++編程中的sizeof運(yùn)算符與typeid運(yùn)算符,是C++入門學(xué)習(xí)中的基礎(chǔ)知識(shí),需要的朋友可以參考下
    2016-01-01
  • C++中遞增運(yùn)算符重載的實(shí)現(xiàn)示例

    C++中遞增運(yùn)算符重載的實(shí)現(xiàn)示例

    在C++中,遞增運(yùn)算符分為前置遞增和后置遞增,重載方式也有明顯區(qū)別,本文就來(lái)詳細(xì)的介紹一下C++中遞增運(yùn)算符重載的實(shí)現(xiàn),文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2026-02-02
  • C語(yǔ)言中輸出空格的五種方法

    C語(yǔ)言中輸出空格的五種方法

    在C語(yǔ)言中,輸出空格可以通過(guò)使用?printf?函數(shù)來(lái)實(shí)現(xiàn),可以直接在字符串中包含空格,或者使用轉(zhuǎn)義字符來(lái)控制格式,本文給大家介紹了幾種常見的輸出空格的方法,需要的朋友可以參考下
    2024-08-08
  • va_list(),va_start(),va_arg(),va_end() 詳細(xì)解析

    va_list(),va_start(),va_arg(),va_end() 詳細(xì)解析

    這些宏定義在stdarg.h中,所以用到可變參數(shù)的程序應(yīng)該包含這個(gè)頭文件.下面我們寫一個(gè)簡(jiǎn)單的可變參數(shù)的函數(shù),該函數(shù)至少有一個(gè)整數(shù)參數(shù),第二個(gè)參數(shù)也是整數(shù),是可選的.函數(shù)只是打印這兩個(gè)參數(shù)的值
    2013-09-09
  • Qt自定義控件實(shí)現(xiàn)圓盤進(jìn)度條

    Qt自定義控件實(shí)現(xiàn)圓盤進(jìn)度條

    這篇文章主要為大家詳細(xì)介紹了Qt自定義控件實(shí)現(xiàn)圓盤進(jìn)度條,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2019-12-12
  • C語(yǔ)言利用數(shù)組處理批量數(shù)據(jù)的方法

    C語(yǔ)言利用數(shù)組處理批量數(shù)據(jù)的方法

    在實(shí)際編程中,我們經(jīng)常需要處理成批的同類型數(shù)據(jù),如果為每個(gè)數(shù)據(jù)單獨(dú)定義變量,不僅代碼冗長(zhǎng)、難以維護(hù),而且無(wú)法靈活應(yīng)對(duì)數(shù)據(jù)量變化,C語(yǔ)言提供的數(shù)組正是解決這類問(wèn)題的核心工具,所以本文介紹了C語(yǔ)言利用數(shù)組處理批量數(shù)據(jù)的方法,需要的朋友可以參考下
    2025-12-12
  • C語(yǔ)言 將字符串逆序輸出的實(shí)例

    C語(yǔ)言 將字符串逆序輸出的實(shí)例

    這篇文章主要介紹了C語(yǔ)言將字符串逆序輸出的實(shí)例,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧
    2021-02-02
  • C++利用類實(shí)現(xiàn)矩陣的數(shù)乘,乘法以及點(diǎn)乘

    C++利用類實(shí)現(xiàn)矩陣的數(shù)乘,乘法以及點(diǎn)乘

    這篇文章主要為大家詳細(xì)介紹了C++如何利用類實(shí)現(xiàn)矩陣的數(shù)乘,乘法以及點(diǎn)乘,文中的示例代碼講解詳細(xì),對(duì)我們學(xué)習(xí)C++有一定幫助,需要的可以參考一下
    2022-11-11

最新評(píng)論

甘孜县| 自治县| 佛学| 大庆市| 砚山县| 汝阳县| 宁蒗| 定边县| 海晏县| 青铜峡市| 深水埗区| 瑞丽市| 唐山市| 纳雍县| 长沙县| 潮安县| 集安市| 阿克陶县| 大港区| 宁南县| 乐平市| 日喀则市| 贵德县| 弥勒县| 揭阳市| 丹东市| 蕉岭县| 岗巴县| 巢湖市| 淳安县| 同心县| 天津市| 寻乌县| 万州区| 蓬溪县| 获嘉县| 临城县| 长沙县| 五华县| 永州市| 娱乐|