STL--set和multiset集合

在這里插入圖片描述


set和multiset會根據特定的排序準則,自動將元素排序。兩者不同之處在于multiset 允許元素重復而 set 不允許。如下圖:

在這里插入圖片描述
使用set或multiset,必須先包含頭文件:

#include <set>

上述兩個類型都被定義為命名空間std內的class template:

namespace std {template <typename T,typename Compare = less<T>,typename Allocator = allocator<T> >class set;template <typename T,typename Compare = less<T>,typename Allocator = allocator<T> >class multiset;
}

其中T是能進行排序的數據類型。第二個參數是進行排序的規則,默認為升序(小于,<),第三個是內存分配器,不用管。

set 和multiset通常用平衡二叉樹(balanced binary tree,確切說是紅黑樹)實現。這樣在插入數據時能自動排序,使得查找元素時有良好性能。其查找函數具有對數O(logn)時間復雜度。

但是,自動排序也造成set和multiset的一個重要限制:你**不能直接改變元素值,**因為這樣會打亂原本正確的順序。

在這里插入圖片描述
從其接口也能反映這種情況:

set和multiset不提供任何函數可以直接訪問元素。

通過迭代器訪問元素時都是常量。

1.1 定義及初始化🍗

set的定義和初始化如下:


#include <set>
#include <iostream>
using namespace std;//輸出s(升序)的所有數據
void Show(const set<int>& s)
{for (auto i : s)cout << i << " ";cout << endl;
}//輸出s(降序)的所有數據
void Show(const set<int,greater<int>>&s)
{for (auto i : s)cout << i << " ";cout << endl;
}int main()
{set <int> s0;//創建一個空的int set集合    s0.insert(5); //插入數據    s0.insert(3);    s0.insert(1);    s0.insert(2);    s0.insert(4);    s0.insert(4);//相同數據插入失敗    set <int> s1(s0); //利用原來的set對象,創建一個新的set對象    set <int> s2 = s1;//同上    set <int> s3(s0.begin(), --s0.end());//利用迭代器創建一個新的set對象set <int> s4{  1, 6, 3, 5, 4, 2  };//利用初始化列表創建一個set對象,可以無序    cout << "s0:"; Show(s0); //輸出數據    cout << "s1:"; Show(s1);    cout << "s2:"; Show(s2);    cout << "s3:"; Show(s3);    cout << "s4:"; Show(s4);    cout << "降序的集合" << endl;    set <int, greater<int> > s5; //創建一個降序的set集合    s5.insert(10);//插入數據    s5.insert(40);    s5.insert(30);    s5.insert(20);    cout << "s5:"; Show(s5);//輸出數據    return 0;    
}

multiset定義和初始化如下:


#include <set>
#include <iostream>
using namespace std;//輸出s(升序)的所有數據
void Show(const multiset<int>& s)
{for (auto i : s)cout << i << " ";cout << endl;
}//輸出s(降序)的所有數據
void Show(const multiset<int, greater<int>>& s)
{for (auto i : s)cout << i << " ";cout << endl;
}int main()
{multiset <int> s0;//創建一個空的int set集合s0.insert(5); //插入數據s0.insert(3);s0.insert(1);s0.insert(2);s0.insert(4);s0.insert(4);//可以插入相同數據multiset <int> s1(s0); //利用原來的set對象,創建一個新的set對象multiset <int> s2 = s1;//同上multiset <int> s3(s0.begin(), --s0.end());//利用迭代器創建一個新的set對象multiset <int> s4{ { 1, 6, 3, 5, 4, 2 } };//利用初始化列表創建一個set對象cout << "s0:"; Show(s0); //輸出數據cout << "s1:"; Show(s1);cout << "s2:"; Show(s2);cout << "s3:"; Show(s3);cout << "s4:"; Show(s4);cout << "降序的集合" << endl;multiset <int, greater<int> > s5; //創建一個降序的set集合s5.insert(10);//插入數據s5.insert(40);s5.insert(30);s5.insert(20);cout << "s5:"; Show(s5);//輸出數據return 0;
}

1.2 向set和multiset中添加元素和刪除元素🍗

通過insert函數插入數據。通過erase刪除元素。


//輸出s(升序)的所有數據
void Show(const set<int>& s)
{for (auto i : s)cout << i << " ";cout << endl;
}
int main()
{set<int> s1;s1.insert(4);s1.insert(1);s1.insert(5);s1.insert(2);cout << "s1:";  Show(s1);s1.erase(2);cout << "刪除2后,s1:";  Show(s1);s1.clear();cout << "清空后,s1:";  Show(s1);return 0;
}

1.3 常用迭代器🍗

set和multiset支持雙向迭代器,不支持隨機迭代器,可以往前和往后,但不能+1,-1(這是隨機迭代器)等。
常用的迭代器如下:
s.begin()
第一個元素的迭代器
s.end()
最后一個元素的下一個位置迭代器(尾后迭代器或尾迭代器)
s.cbegin()
第一個元素的常量迭代器(不修改元素內容)
s.cend()
尾后常量迭代器(不修改元素內容)
s.rbegin()
第一個反向迭代器
s.rend()
尾后反向迭代器

int main()    
{set<int> s1;    s1.insert(4);    s1.insert(1);    s1.insert(5);    s1.insert(2);    cout << "從頭到尾輸出s1:";    for (auto p = s1.begin(); p != s1.end(); p++)    cout << *p << " ";    cout << endl;    cout << "從后往前輸出s1:";    for (auto p = s1.rbegin(); p != s1.rend(); p++)    cout << *p << " ";    cout << endl;    auto p = s1.begin();    cout << "第二個元素:"<< * (++p) << endl;//輸出第二個元素    cout << "第一個元素:"<< * (--p) << endl;//輸出第一個元素    //cout << *(p + 1) << endl;//錯誤    return 0;    
}

1.4 set和multiset常用的運算符🍗

set和multiset類既支持常用的=,==,!=,< , >等運算符,也可以通過調用其成員函數來執行相應的操作。下面列舉了其常用的操作。詳細情況可以參考set或multiset幫助手冊。


//輸出s(升序)的所有數據    
void Show(const set<int>& s)    
{for (auto i : s)    cout << i << " ";    cout << endl;    
}int main()    
{set<int> s1;    s1.insert(4);    s1.insert(1);    s1.insert(5);    s1.insert(2);    cout << "s1:";  Show(s1);    set<int> s2;    s2 = s1;    cout << "s2:";  Show(s2);    if (s1 == s2)    cout << "s1 == s2" << endl;    s2.insert(7);    cout << "往s2插入7后,";    if (s1 > s2)    cout << "s1 > s2" ;    else if (s1 < s2)    cout << "s1 < s2" ;    //cout << s1[1] << endl;//錯誤    return 0;    
}

1.5 set和multiset常用成員函數🍗

下面列舉set和multiset對象常用的成員函數,詳細的介紹請查看幫助手冊。

在這里插入圖片描述

1.6 set應用場景🍗

set在C++中是一個內部自動有序且不含重復元素的容器,它的應用場景廣泛且多樣。以下是一些set的常見應用場景:

1.自動排序
如果需要對元素保持持續的排序狀態,如維持一個按字母順序排列的單詞列表、存儲并維護一個按年齡升序或降序排列的人口數據庫等,std::set 可以實現這一功能。每次插入新元素,容器都會自動調整元素的順序。

當然如果僅僅是排序,可以使用sort函數進行排序.
sort排序是在排序瞬間的,如果又插入新的數據可能不再有序
set的有序是持續的,不管插入還是刪除數據它始終有序

2.快速查找
由于set內部采用了高效的平衡查找二叉樹(如紅黑樹),因此它提供快速的查找性能。包括檢查元素是否已存在(.count() 或 .find())、查找特定值的下一個/前一個元素(迭代器操作)。這對于實現諸如查找詞匯表中的下一個更大詞、或者在游戲中查找排名高于當前玩家的下一個玩家等場景很有用。


本篇完!🍗

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/web/14682.shtml
繁體地址,請注明出處:http://hk.pswp.cn/web/14682.shtml
英文地址,請注明出處:http://en.pswp.cn/web/14682.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

亞馬遜自養號測評:深入解析與搭建要求

在亞馬遜這電商平臺上&#xff0c;商品的評價對于賣家來說至關重要。為了提升商品的曝光率、排名、權重和銷量&#xff0c;賣家們紛紛采用各種推廣方式&#xff0c;其中&#xff0c;亞馬遜自養號測評成為了越來越多賣家選擇的一種有效方式。 亞馬遜自養號測評&#xff0c;顧名…

Android Retrofit 封裝模版

提示&#xff1a;文章寫完后&#xff0c;目錄可以自動生成&#xff0c;如何生成可參考右邊的幫助文檔 文章目錄 一、加上網絡訪問的權限二、引入依賴三、由API生成JavaBean四、封裝Retrofit五、調用 一、加上網絡訪問的權限 <uses-permission android:name"android.p…

分布式事務——9種解決方案的原理與分類

目錄 一、概要1. 分布式事務的概念2. 分布式事務解決方案分類 二、常見的分布式事務解決方案1. 基礎的 2PC&#xff08;二階段提交&#xff09;1.1 核心思想1.2 簡介1.3 主要特點1.3.1 優點1.3.2 缺點 2. 基礎的 3PC&#xff08;三階段提交&#xff09;2.1 核心思想2.2 簡介2.3…

C語言/數據結構——每日一題(有效的括號)

一.前言 如果想要使用C語言來解決這道題——有效的括號&#xff1a;https://leetcode.cn/problems/valid-parentheses/description/我們必須要借用上一篇我們所講的內容——棧的實現&#xff1a;https://blog.csdn.net/yiqingaa/article/details/138923750?spm1001.2014.3001.…

go routing 之 gorilla/mux

1. 背景 繼續學習 go 2. 關于 routing 的學習 上一篇 go 用的庫是&#xff1a;net/http &#xff0c;這次我們使用官方的庫 github.com/gorilla/mux 來實現 routing。 3. demo示例 package mainimport ("fmt""net/http""github.com/gorilla/mux&…

react實現把pc網站快捷添加到桌面快捷方式

文章目錄 1. 需求2. 實現效果3. 核心邏輯4. 完整react代碼 1. 需求 這種需求其實在國外一些游戲網站和推廣網站中經常會用到&#xff0c;目的是為了讓客戶 快捷方便的保存網站到桌面 &#xff0c;網站主動盡量避免下次找不到網站地址了&#xff0c;當然精確的客戶自己也可以使…

Python 字符串中運算符號可運行

使用eval() re {\n "path": "/sms/sendMsg",\n "data": {\n "mobile": "12345678901",\n "signCode": "短信簽名",\n "templateCode": "SMS_yyyy…

Oracle遞歸查詢筆記

目錄 一、創建表結構和插入數據 二、查詢所有子節點 三、查詢所有父節點 四、查詢指定節點的根節點 五、查詢指定節點的遞歸路徑 六、遞歸子類 七、遞歸父類 一、創建表結構和插入數據 CREATE TABLE "REGION" ( "ID" VARCHAR2(36) DEFAULT SYS_GUI…

解析Oracle文件頭內容

保存在Oracle數據文件頭中的信息很豐富&#xff0c;通常只要查詢DATAFILE_HEADER視圖就可以獲得數據文件頭中的信息。但其在數據文件頭中的具體位置&#xff0c;Oracle一直未公開過。所幸的是DBA們對數據文件頭的研究孜孜不倦&#xff0c;其研究成果在網上也是隨處可見。雖然這…

[前端|vue] 驗證器validator使用筆記 (筆記)

文檔 validator.js文檔地址 規則編寫示例 element-plus 使用示例 const captchaLoginRules {phoneNumber: [{ required: true, message: 手機號不能為空, trigger: blur },{validator: (_rule: any, value: string, _callback: any): boolean > {return isMobilePhone(…

vue-quill-editor 富文本編輯器使用出現的樣式問題

使用富文本類型&#xff1a; vue-quill-editor 注意&#xff1a; 富文本導出 html 我們使用的時候&#xff0c; 樣式凸顯不出來 DOM 結構 <p><sub class"ql-size-large">測試內容</sub><sup class"ql-size-large">222222</su…

6步:用NGINX部署ASP.NET Core,輕松上云

1. 準備工作在開始部署之前&#xff0c;確保你已經完成了以下準備工作&#xff1a;- 安裝.NET Core&#xff1a;確保你的Linux系統上安裝了.NET Core運行時。你可以從.NET官網下載。- 安裝NGINX&#xff1a;通過你的Linux發行版的包管理器安裝NGINX。例如&#xff0c;在Ubuntu上…

GPT提示詞技巧,使用教程,國內版官網直達,非套殼

GPT提示詞技巧&#xff0c;使用教程&#xff0c;國內版官網直達&#xff0c;非套殼 主站點&#xff1a;https://chatgpt-plus.top&#xff08;江蘇福建地區打不開&#xff0c;需要魔法&#xff09; 店鋪地址&#xff1a;https://buy.chatgpt-plus.top/ 選擇plus賬號進入&…

鴻蒙開發ArkUI-X基礎知識:【ArkUI代碼工程及構建介紹】

代碼工程及構建介紹 背景 ArkUI作為OpenHarmony的默認開發框架&#xff0c;在本項目&#xff08;ArkUI-X&#xff09;中需要做到一套代碼同時支持多平臺構建&#xff0c;所以會采取共倉開發的方式&#xff0c;部分倉直接指向OpenHarmony相關開源倉。 代碼結構及倉庫結構 代…

多模態模型(MLLM)論文串燒

近期看了一些多模態方向的工作&#xff0c;包括圖像、文本多模態&#xff0c;圖像、視頻、語音、文本多模態&#xff0c;做個總結。 Yi Qwen-VL LLaVA MobileVLM LanguageBind Video-LLaVA VAST

【機器學習300問】94、什么是多任務學習?

一、多任務學習的定義 多任務學習&#xff08;Multi-Task Learning, MTL&#xff09;是一種機器學習范式&#xff0c;它允許一個模型同時學習執行多個相關但不完全相同的任務。這種方法的核心是&#xff1a;通過共享表示或權重&#xff0c;不同的任務可以在學習過程中相互促進&…

淺談微服務的自動化部署

一、常用部署工具 jenkins,docker生態是比較常用的工具&#xff0c;本文也主要是聊這幾個。其他如Kubernetes (K8s)&#xff0c;Ansible&#xff0c;GitLab CI/CD等工具本文只是暫時提一下&#xff0c;不展開討論。 二、比較jenkins和docker生態 1、jenkins 優點 jenkins功…

Rust使用rust_xlsxwriter庫把Vec數據寫入Excel

一、Rust使用rust_xlsxwriter庫把一維Vec數據寫入Excel 在Rust中&#xff0c;使用rust_xlsxwriter庫將一維Vec數據寫入Excel文件是一個相對簡單的過程。首先&#xff0c;你需要確保你的Cargo.toml文件中已經添加了rust_xlsxwriter依賴。以下是如何添加依賴的示例&#xff1a; …

KMP題解代碼(含講解)

目錄 注意: next數組的變化規律&#xff1a; 初始化&#xff1a; 求next數組部分&#xff1a; KMP部分&#xff1a; AC代碼&#xff1a; 題目鏈接&#xff1a;【模板】KMP - 洛谷 注意: 1、next數組是針對子串的&#xff0c;并未涉及母串&#xff0c;因此求next數組時…

Python中文件操作和異常處理

文章目錄 一、文件操作1.概念2.文件3.二進制 二、基本文件操作三、亂碼產生四、with open() as f五、代碼實現文件復制粘貼六、try ... except ...七、代碼比較 一、文件操作 1.概念 幫助我們把爬蟲抓下來的數據&#xff0c;進行保存。 2.文件 在計算機中&#xff0c;沒有p…