c++set和pair的使用

set是C++中的一種關聯容器,具有以下特點:

  • 存儲唯一元素(不允許重復)

  • 元素自動排序(默認升序)

  • 基于紅黑樹實現(平衡二叉搜索樹)

  • 插入、刪除和查找的時間復雜度為O(log n)


前言

在C++標準模板庫(STL)中,setpair是兩個非常重要且常用的組件。set是一種關聯式容器,提供高效的查找、插入和刪除操作;pair則是將兩個值組合成一個單元的實用工具。本文將深入探討它們的特性、用法以及實際應用場景。

1.?pair?模板類詳解

1.1?pair?的基本概念

pair?是 C++ 標準模板庫中的一個實用模板類,定義在?<utility>?頭文件中。它將兩個值組合成一個單元,這兩個值可以是相同或不同的類型。

#include <utility>  // 包含pair的定義
#include <iostream>
using namespace std;int main() {// 創建pair的三種方式pair<int, string> p1(1, "Apple");  // 直接構造auto p2 = make_pair(2, "Banana");  // 使用make_pair函數pair<int, string> p3 = {3, "Orange"};  // C++11統一初始化// 訪問pair的成員cout << "p1: " << p1.first << ", " << p1.second << endl;cout << "p2: " << p2.first << ", " << p2.second << endl;cout << "p3: " << p3.first << ", " << p3.second << endl;return 0;
}

pair<T1, T2>?模板接受兩個類型參數? ? ?first?和?second?是pair的兩個公有成員,用于訪問存儲的值? ? ? ?make_pair?可以自動推導類型,比直接構造更簡潔

1.2?pair?的比較操作

pair支持比較運算符,按照字典序進行比較:先比較first,如果first相等再比較second。

pair<int, int> a(1, 2);
pair<int, int> b(1, 3);
pair<int, int> c(2, 1);cout << boolalpha;
cout << (a < b) << endl;  // true (1==1, 2<3)
cout << (a < c) << endl;  // true (1<2)
cout << (b < c) << endl;  // true (1<2)

2.?set?容器詳解

set?的構造和初始化

#include <iostream>
#include <set>
using namespace std;int main() {// 空setset<int> s1;// 初始化列表(C++11)set<int> s2 = {3, 1, 4, 1, 5};  // 實際存儲1,3,4,5// 使用數組范圍初始化int arr[] = {2, 4, 6, 4, 2};set<int> s3(arr, arr + 5);  // 存儲2,4,6// 拷貝構造set<int> s4(s3);// 輸出set內容cout << "s2: ";for(int num : s2) cout << num << " ";cout << "\ns3: ";for(int num : s3) cout << num << " ";return 0;
}

set?會自動去重和排序? ? ?可以使用數組指針作為迭代器范圍初始化? ? 基于范圍的for循環可以方便地遍歷set

set?的常用操作

插入元素

set<string> fruits;
fruits.insert("Apple");
fruits.insert("Banana");
fruits.insert("Orange");// 檢查插入是否成功
auto ret = fruits.insert("Apple");  // 嘗試重復插入
if(!ret.second) {cout << "Apple already exists in set" << endl;
}

刪除元素

// 通過值刪除
fruits.erase("Banana");// 通過迭代器刪除
auto it = fruits.find("Orange");
if(it != fruits.end()) {fruits.erase(it);
}// 刪除范圍
set<int> nums = {1, 2, 3, 4, 5};
nums.erase(nums.find(2), nums.find(4));  // 刪除[2,4)

查找元素

set<int> s = {10, 20, 30, 40, 50};// 使用find()
auto it = s.find(30);
if(it != s.end()) {cout << "Found: " << *it << endl;
}// 使用count()
if(s.count(25) > 0) {cout << "25 exists" << endl;
} else {cout << "25 doesn't exist" << endl;
}

如果找到元素:返回指向該元素的迭代器? ?如果找不到元素:返回?s.end(),即指向?set?末尾的迭代器(不指向任何有效元素)。

set?與?pair?的結合使用

// 使用pair作為set的元素
set<pair<int, string>> studentScores;
studentScores.insert({90, "Alice"});
studentScores.insert({85, "Bob"});
studentScores.insert({95, "Charlie"});// 遍歷
for(const auto& entry : studentScores) {cout << entry.second << ": " << entry.first << endl;
}/*
輸出:
Bob: 85
Alice: 90
Charlie: 95
*/

性能對比

操作時間復雜度說明
insert()O(log n)插入元素并保持有序
erase()O(log n)刪除元素
find()O(log n)查找元素
count()O(log n)檢查元素是否存在
size()O(1)獲取元素數量
empty()O(1)檢查是否為空

pairset?和?map?的聯系與區別

特性std::pairstd::setstd::map
元素類型任意兩種類型的組合單一類型pair<const Key, Value>
元素數量固定兩個成員(first和second)動態變化動態變化
排序方式無排序按元素值排序按鍵排序
唯一性不適用元素值唯一鍵唯一
訪問方式直接訪問.first和.second通過迭代器通過鍵或迭代器
查找效率不適用O(log n)O(log n)
插入操作直接構造insert()/emplace()insert()/emplace()/operator[]
典型應用場景多返回值、map元素需要唯一且有序的集合鍵值對關聯存儲
內存結構連續存儲兩個成員樹狀結構樹狀結構
修改限制兩個成員都可修改元素不可修改(只能刪除后插入)鍵不可修改,值可修改

std::set?的 "元素值唯一"

含義set?中存儲的每個元素值都必須是唯一的,不能有重復。

std::set<int> numbers = {1, 2, 2, 3}; // 實際存儲:{1, 2, 3}

??????底層機制set?在插入新元素時,會檢查是否已存在相同的值。如果存在,則不會插入。

std::map?的 "鍵唯一"

含義map?中每個元素的鍵(key)必須是唯一的,但值(value)可以重復

std::map<std::string, int> ages = {{"Alice", 25},{"Bob", 25},    // 值可以重復{"Alice", 30}   // 鍵重復!第二個 "Alice" 會覆蓋第一個
};

兩個鍵?"Alice"?沖突時,后者會覆蓋前者的值(最終?"Alice"?對應?30)。值?25?可以重復出現(如?"Alice"?和?"Bob"?的值都是?25


總結

pair?和?set?是C++ STL中非常重要的兩個組件:

pair 用于將兩個值組合成一個單元? ?set?用于維護一個唯一、有序的集合

它們可以單獨使用,也可以結合使用(例如?set<pair<T1, T2>>)。理解它們的特性和正確使用方式,可以大大提高C++編程的效率和質量。

?

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

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

相關文章

終端命令行執行具體的方法名測試用例

你可以使用如下命令單獨執行 test_mutation_login_by_email 方法:python3 manage.py test apps.login.test_client.LoginTestCase.test_mutation_login_by_email 注意事項: 路徑 apps.login.test_client 要與你項目實際的 Python 包路徑一致(即 test_client.py 文件所在的包…

20250620在Ubuntu20.04.6下編譯KickPi的K7的Android14系統

【處理SDK】 rootrootrootroot-X99-Turbo:~/Android14$ tar zxvf rk3576-android14.0-20250217.tar.gz rootrootrootroot-X99-Turbo:~/Android14$ ll rootrootrootroot-X99-Turbo:~/Android14$ rm rk3576-android14.0-20250217.tar.gz rootrootrootroot-X99-Turbo:~/Android1…

碳中和時代的家電革命,從華為智選IAM看科技企業的環保擔當

在"雙碳"戰略與品質消費浪潮的雙重加持下&#xff0c;家電產業正經歷一場前所未有的綠色革命。華為智選與空凈十大品牌IAM的深度協同&#xff0c;不僅構建了智能家電領域的技術新高地&#xff0c;更通過系統性創新持續拓展著行業可持續發展的想象空間。從凈水科技的突…

(C語言)Map數組的實現(數據結構)(鏈表)(指針)

源代碼&#xff1a; #include <stdio.h> #include <stdlib.h> #include <string.h>// 鍵值對節點 typedef struct Node {char* key;int value;struct Node* next; } Node;// Map結構 typedef struct {Node* buckets[100]; // 固定大小的哈希桶&#xff08;…

Logback示例解析

<configuration><!-- 環境變量 --><springProperty scope"context" name"app.name" source"spring.application.name" defaultValue"application"/><!-- 日志存放路徑 --><property name"log.path&qu…

elementui響應式數據類型變更情況

背景。vue2。data中定義的響應數據類型是[]數組。應用在el-select中&#xff08;非multiple情況&#xff09;。當發生響應數據有變更渲染視圖時&#xff0c;發現定義的數組轉換成了字符串。 本身不是問題。但因為疏忽引發了watch監聽formData數據時產生了產生了多次監聽事件。…

人機融合智能 | 人智交互語境下的設計新模態

本章旨在探討技術與設計領域在人智交互語境下的關系及其影響,討論通過傳統設計對人智交互的優化方法。通過回顧大數據和發展趨勢,以 AI技術作為重要的技術推力,我們認為 AI技術將會在未來成為設計領域不可缺少的重要環節,并能夠幫助設計師更加高效、準確地開展設計工作。本章著…

C++設計模式分類(GOF-23種設計模式)

文章目錄 GOF-23 設計模式分類一、從目的分類1. 創建型&#xff08;Creational&#xff09;模式2. 結構型&#xff08;Structural&#xff09;模式3. 行為型&#xff08;Behavioral&#xff09;模式 二、從范圍分類1. 類模式&#xff08;Class Pattern&#xff09;2. 對象模式&…

AbMole| LY294002(M1925)

LY294002是一種廣譜的PI3K抑制劑&#xff0c;對PI3Kα/δ/β的IC50分別為0.5 μM/0.57 μM/0.97 μM。LY294002 也可以抑制 CK2 的活性&#xff0c;IC50 為 98 nM。LY294002 還是一種競爭性 DNA-PK 抑制劑&#xff0c;可逆結合 DNA-PK 的激酶結構域&#xff0c;IC50 為 1.4 μM…

第1章,[標簽 Win32] :第一個 WIn32 程序,MessageBox 函數

專欄導航 上一篇&#xff1a;第1章&#xff0c;[標簽 Win32] &#xff1a;第一個 WIn32 程序&#xff0c;程序入口 回到目錄 下一篇&#xff1a;無 本節前言 本節的學習&#xff0c;需要前兩節的內容作為先修知識。如果還沒有去看本專欄的前兩節&#xff0c;請你先去學習它…

求助帖:學Java開發方向還是網絡安全方向前景好

最近網絡安全被一個培訓機構吹得天花亂墜&#xff0c;雖然他家既有網安又有java和UI&#xff0c;我也是學軟件工程的&#xff08;山西某211&#xff0c;此機構是每年和我們學校合作的校企公司&#xff09;&#xff0c;但那里的老師仍然大力推薦我學網絡安全&#xff08;滲透、代…

OpenCV 圖像仿射變換之旋轉

一、知識點 1、void warpAffine(InputArray src, OutputArray dst, InputArray M, Size dsize, int flags INTER_LINEAR, int borderMode BORDER_CONSTANT, …

HCIP-數據通信基礎

前言&#xff1a;本博客僅作記錄學習使用&#xff0c;部分圖片出自網絡&#xff0c;如有侵犯您的權益&#xff0c;請聯系刪除 本篇筆記是根據B站上的視頻教程整理而成&#xff0c;感謝UP主的精彩講解&#xff01;如果需要了解更多細節&#xff0c;可以參考以下視頻&#xff1a;…

C語言基本數據類型與變量詳解

# C語言基本數據類型與變量詳解 ## 數據類型概述 在C語言中&#xff0c;數據類型決定了變量在內存中的存儲方式和大小&#xff0c;以及可以對其執行的操作。合理選擇數據類型能夠提高程序的效率和準確性&#xff0c;避免內存浪費和數據溢出等問題。 C語言的基本數據類型主要包括…

Babylon.js學習之路《十、高級幾何體:自定義模型與復雜形狀生成》

文章目錄 1. 引言&#xff1a;高級幾何體的應用場景2. 參數化建模&#xff1a;Babylon.MeshBuilder2.1 擴展幾何體類型2.2 自定義多邊形&#xff08;ExtrudePolygon&#xff09; 3. 頂點級建模&#xff1a;自定義VertexData3.1 手動定義頂點數據3.2 動態生成地形&#xff08;高…

【趙渝強老師】Kubernetes的安全框架

Kubernetes集群的安全框架主要由以下認證、鑒權和準入控制三個階段組成。這三個階段的關系如下圖所示。 視頻講解如下 【趙渝強老師】Kubernetes的安全框架 認證&#xff08;Authentication&#xff09; 當客戶端與Kubernetes集群建立HTTP通信時&#xff0c;首先HTTP請求會進…

CDN與靜態資源優化

CDN與靜態資源優化 在現代Web系統和AI應用中&#xff0c;隨著用戶訪問量的不斷攀升&#xff0c;靜態資源&#xff08;如HTML、CSS、JavaScript、圖片、音視頻、模型文件等&#xff09;帶來的負載日益沉重。尤其在大模型推理、前端渲染、廣告投放等場景中&#xff0c;靜態資源的…

如何填寫“appium inspector”內容?

1. 確認已經開啟appium的服務&#xff0c;運行appium 參考內容&#xff1a;{"appium:platformName": "Android", # 系統名稱"appium:platformVersion": "9", # 安卓版本&#xff0c;看設備"appium:deviceName": "3d…

mysql server層做了什么

服務器處理客戶端請求 服務器程序在處理來自客戶端的查詢請求時&#xff0c;大致需要分為3部分&#xff1a;連接管理、解析與優化、存儲引擎。 連接管理 每當有一個客戶端進程連接到服務器進程時&#xff0c;服務器進程都會創建一個線程專門處理與這個客戶端的交互&#xff…

APISIX 簡介:云原生 API 網關的架構與實踐

文章目錄 引言&#xff1a;APISIX 概述基于Nginx構建的原因基于etcd構建的原因 架構圖示架構分層解析管理層&#xff1a;人機交互與配置入口控制層&#xff1a;配置管理與集群協調數據面&#xff1a;請求處理與流量轉發說明&#xff1a;關于OpenRestry 引言&#xff1a;APISIX …