C++(初階)(十六)——set

set

  • set
    • set介紹
    • set的構造和迭代器
    • set的增刪查
      • find
      • lower_bound
      • multiset和set的差異
    • 題目
      • [349. 兩個數組的交集 - 力扣(LeetCode)](https://leetcode.cn/problems/intersection-of-two-arrays/description/)
      • 交集
      • 差集
      • [142. 環形鏈表 II - 力扣(LeetCode)](https://leetcode.cn/problems/linked-list-cycle-ii/description/)

set介紹

1,set的聲明如下,T就是set底層關鍵字的類型

2,set默認要求T?持?于?較,如果不?持或者想按??的需求?可以??實現仿函數傳給第?個模版參數

3,set底層存儲數據的內存是從空間配置器申請的,如果需要可以??實現內存池,傳給第三個參 數。

4,?般情況下,我們都不需要傳后兩個模版參數。

5,set底層是?紅?樹實現,增刪查效率是O(logN) ,迭代器遍歷是?的搜索樹的中序,所以是有序的。

6,前?部分我們已經學習了vector/list等容器的使?,STL容器接?設計,?度相似,所以這?我們 就不再?個接??個接?的介紹,?是直接帶著?家看?檔,挑?較重要的接?進?介紹。

7,set是會去重的,所以刪除數據時,沒有使用bool值,而是int值。

set的構造和迭代器

set的?持正向和反向迭代遍歷,遍歷默認按升序順序,因為底層是?叉搜索樹,迭代器遍歷?的中序;

?持迭代器就意味著?持范圍for,set的iterator和const_iterator都不?持迭代器修改數據,修改 關鍵字數據,破壞了底層搜索樹的結構。

// empty (1) 
?參默認構造explicit set (const key_compare& comp = key_compare(),const allocator_type& alloc = allocator_type());// range (2) 
迭代器區間構造template <class InputIterator>set (InputIterator first, InputIterator last,const key_compare& comp = key_compare(),const allocator_type& = allocator_type());// copy (3) 
拷?構造set (const set& x);// initializer list (5) initializer 
列表構造set (initializer_list<value_type> il,
const key_compare& comp = key_compare(),
const allocator_type& alloc = allocator_type());//迭代器是?個雙向迭代器
//正向迭代器
iterator   -> a bidirectional iterator to const value_type
iterator begin();
iterator end();//反向迭代器
reverse_iterator rbegin();
reverse_iterator rend();

set的增刪查

find

算法庫中實現的查找是迭代器遍歷,時間復雜度是O(n)

set內部實現的查找與樹的高度有關,時間復雜度是O(logn)

count返回一個數據在set中的個數,但是set會去重,所以返回值是0或1,也是int值。

	set<int> s = { 2,3,1,7,1,1,5 };for (auto e : s){cout << e << " ";}cout << endl;//直接刪除值為val的數據,不存在返回0s.erase(1);for (auto e : s){cout << e << " ";}cout << endl;//直接查找在利?迭代器刪除valauto pos = s.find(3);if (pos != s.end()){s.erase(pos);}for (auto e : s){cout << e << " ";}cout << endl;//利?count間接實現快速查找int x = 7;if (s.count(x)){cout << x << "存在" << endl;}else{cout << x << "不存在" << endl;}

lower_bound

//返回?于等val位置的迭代器
iterator lower_bound (const value_type& val) const;

//返回?于val位置的迭代器
iterator upper_bound (const value_type& val) const;

算法庫中也有lower_bound,upper_bound,但是要求是要對容器區間排序。
注意所得區間是左閉右開[lower,upper)

如果所給val > set.end();會返回set.end();的值

	set<int> myset = { 10,20,30,40,50,60,70,80,90 };for (auto e : myset){cout << e << " ";}cout << endl;//返回 >= 30位置的迭代器auto low = myset.lower_bound(30);//返回 > 70位置的迭代器,如果所給val > myset.end();會返回myset.end();的值auto up = myset.upper_bound(70);//使用迭代器打印[30,70)區間的值auto it = low;while (it != up){cout << *it << " ";++it;}cout << endl;//刪除[30,70)區間的值myset.erase(low, up);for (auto e : myset){cout << e << " ";}cout << endl;

multiset和set的差異

使用multiset,頭文件依然是#include< set >,不需要其他頭文件

multiset不會進行去重操作。

在進行查找操作時,查找到數據是中序遍歷的第一個數據。

題目

349. 兩個數組的交集 - 力扣(LeetCode)

給定兩個數組 nums1nums2 ,返回 它們的 交集 。輸出結果中的每個元素一定是 唯一 的。我們可以 不考慮輸出結果的順序

示例 1:

輸入:nums1 = [1,2,2,1], nums2 = [2,2]
輸出:[2]

示例 2:

輸入:nums1 = [4,9,5], nums2 = [9,4,9,8,4]
輸出:[9,4]
解釋:[4,9] 也是可通過的

去重:unique(算法庫中);set都可以

class Solution {
public:vector<int> intersection(vector<int>& nums1, vector<int>& nums2) {// set<int> s1;// for(auto e : nums1)// {//     s1.insert(e);// }// set<int> s2;// for(auto e : nums2)// {  //     s2.insert(e);// }//迭代器區間構造比較方便set<int> s1(nums1.begin(),nums1.end());set<int> s2(nums2.begin(),nums2.end());vector<int> v;for(auto e : s1){//在set中count的返回值是1或0,如果s1中的數據在s2中也存在,就是交集if(s2.count(e)){v.push_back(e);}}return v;}
};

除此之外,還有方法能求交集,當然也可以帶入求差集。

并集是直接遍歷插入set< >即可,set< >會去重

交集

	vector<int> nums1 = { 1,3,5,6,7,8,9 };vector<int> nums2 = { 1,2,3,4,6 };vector<int> ret;//去重+排升序set<int> s1(nums1.begin(), nums1.end());set<int> s2(nums2.begin(), nums2.end());//遍歷比較auto it1 = s1.begin();auto it2 = s2.begin();while (it1 != s1.end() && it2 != s2.end()){if (*it1 < *it2){++it1;}else if (*it1 > *it2){++it2;}else{//ret.push_back(*it1);ret.push_back(*it2);++it1;++it2;}}for (auto e : ret){cout << e << " ";}cout << endl;

差集

	vector<int> nums1 = { 1,3,5,6,7,8,9 };vector<int> nums2 = { 1,2,3,4,6 };vector<int> ret;//去重+排升序set<int> s1(nums1.begin(), nums1.end());set<int> s2(nums2.begin(), nums2.end());//遍歷比較auto it1 = s1.begin();auto it2 = s2.begin();while (it1 != s1.end() && it2 != s2.end()){if (*it1 < *it2){ret.push_back(*it1);++it1;}else if (*it1 > *it2){ret.push_back(*it2);++it2;}else{++it1;++it2;}}//剩余值繼續記錄while (it1 != s1.end()){ret.push_back(*it1);++it1;}while (it2 != s2.end()){ret.push_back(*it2);++it2;}for (auto e : ret){cout << e << " ";}cout << endl;

142. 環形鏈表 II - 力扣(LeetCode)

給定一個鏈表的頭節點 head ,返回鏈表開始入環的第一個節點。 如果鏈表無環,則返回 null

如果鏈表中有某個節點,可以通過連續跟蹤 next 指針再次到達,則鏈表中存在環。 為了表示給定鏈表中的環,評測系統內部使用整數 pos 來表示鏈表尾連接到鏈表中的位置(索引從 0 開始)。如果 pos-1,則在該鏈表中沒有環。注意:pos 不作為參數進行傳遞,僅僅是為了標識鏈表的實際情況。

不允許修改 鏈表。

示例 1:

img

輸入:head = [3,2,0,-4], pos = 1
輸出:返回索引為 1 的鏈表節點
解釋:鏈表中有一個環,其尾部連接到第二個節點。

示例 2:

img

輸入:head = [1,2], pos = 0
輸出:返回索引為 0 的鏈表節點
解釋:鏈表中有一個環,其尾部連接到第一個節點。

示例 3:

img

輸入:head = [1], pos = -1
輸出:返回 null
解釋:鏈表中沒有環。
/*** Definition for singly-linked list.* struct ListNode {*     int val;*     ListNode *next;*     ListNode(int x) : val(x), next(NULL) {}* };*/
class Solution {
public:ListNode *detectCycle(ListNode *head) {set<ListNode*> s;ListNode* cur = head;while(cur){auto ret = s.insert(cur);if(ret.second == false)return cur;cur = cur->next;}return nullptr;}
};

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

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

相關文章

higress之:讓流量通過gateway

本來想測跨域問題&#xff0c;結果參數配置過去之后一直沒生效&#xff0c;經過了解說是gateway才是設置跨域參數的核心&#xff0c;所以需要讓流量通過gateway&#xff0c;搗鼓了半天記錄一下 第一步&#xff0c;測試服務是否正常 通過get svc、pod等&#xff0c;發現各pod都…

C盤哪些文件刪除之后無影響,可以清理磁盤空間。

C盤是電腦的系統盤,存放了操作系統的重要文件和部分默認安裝的軟件。當C盤空間不足時,系統可能運行緩慢甚至卡頓,這時清理C盤是一個有效的解決方法。由于C盤包含許多關鍵數據,清理時需要格外謹慎,以免誤刪導致系統崩潰。將詳細介紹C盤中可以安全刪除的文件類型及清理方法,…

開源項目實戰學習之YOLO11:ultralytics-cfg-models-fastsam(九)

&#x1f449; 點擊關注不迷路 &#x1f449; 點擊關注不迷路 &#x1f449; 點擊關注不迷路 文章大綱 1. __init__.py2. model.py3. predict.py4. utils.py5. val.py FastSAM 是一種目標檢測和圖像分割模型&#xff0c;Ultralytics 是一個在計算機視覺領域廣泛使用的庫&#x…

Windows11安裝Docker

本次安裝環境 Windows11&#xff08;23H2&#xff09;&#xff0c;CPU&#xff08;12代Intel&#xff09; 什么是Docker Docker 是一個軟件平臺&#xff0c;讓您可以快速構建、測試和部署應用程序。Docker 將軟件打包成名為容器的標準化單元&#xff0c;這些單元具有運行軟件所…

C# 在VS2022中開發常用設置

一、基礎環境配置 1. 安裝必要組件 在 VS2022 安裝時確保勾選以下工作負載&#xff1a; ??使用 .NET 的桌面開發??&#xff08;包含 WPF/WinForms&#xff09;??ASP.NET 和 Web 開發????.NET 跨平臺開發????Azure 開發????數據存儲和處理?? 2. 主題與外…

k8s的volume

一、volume介紹 volume是Pod中能夠唄多個容器訪問的共享目錄。Kubernetes的Volume概念、用途和目的與Docker的Volume比較類似,但兩者不能等價。首先,Kubernetes中的Volume定義在Pod上,然后被一個Pod里的多個容器掛載到具體的文件目錄下;其次,Kubernetes中的Volume與Pod的生…

Java 未來技術棧:從云原生到 AI 融合的企業級技術演進路線

一、云原生架構&#xff1a;重構 Java 應用的運行范式 1.1 微服務架構的深度進化 Java 在微服務領域的實踐正從 Spring Cloud 向服務網格&#xff08;Service Mesh&#xff09;演進。以 Istio 為代表的服務網格技術&#xff0c;通過 Sidecar 模式實現服務間通信的透明化管理&…

阿里云 ECS 服務器進階指南:存儲擴展、成本優化與架構設計

一、彈性存儲架構&#xff1a;塊存儲深度解析與掛載實踐 &#xff08;一&#xff09;塊存儲類型與技術特性 阿里云塊存儲作為 ECS 核心存儲方案&#xff0c;提供三種主流類型&#xff1a; ESSD 云盤 性能等級&#xff1a;PL0/PL1/PL2/PL3&#xff0c;最高支持 100 萬 IOPS …

centos 安裝jenkins

centos 安裝jenkins 在 CentOS 上安裝 Jenkins 是一個相對直接的過程。以下是一個逐步指南&#xff0c;幫助你安裝 Jenkins&#xff1a; 步驟 1&#xff1a;安裝 Java Jenkins 需要 Java 運行環境&#xff0c;因此首先確保你的系統上安裝了 Java。你可以使用以下命令來安裝 …

十三種物聯網/通信模塊綜合對比——《數據手冊--物聯網/通信模塊》

物聯網&#xff0f;通信模塊 名稱 功能 應用場景 USB轉換模塊 用于將USB接口轉換為其他類型的接口&#xff0c;如串口、并口等&#xff0c;實現不同設備之間的通信。 常用于計算機與外部設備&#xff08;如打印機、掃描儀等&#xff09;的連接&#xff0c;以及數據傳輸和設…

【基礎知識】常見的計算公式(二)

目錄標題 一、ADC&#xff08;模擬 - 數字轉換器&#xff09;相關公式1. ADC 分辨率計算2. ADC 轉換結果對應的模擬電壓計算 二、DAC&#xff08;數字 - 模擬轉換器&#xff09;相關公式1. DAC 輸出電壓計算 三、SPI&#xff08;串行外設接口&#xff09;相關公式1. SPI 數據傳…

DeepSeek V1:初代模型的架構與性能

DeepSeek V1(又稱DeepSeek-MoE)是DeepSeek系列的首代大規模語言模型,它采用Transformer結合稀疏混合專家(MoE)的創新架構,實現了在受控算力下的大容量模型。本文將深入解析DeepSeek V1的架構設計與技術細節,包括其關鍵機制、訓練優化策略,以及在各類NLP任務上的表現。 …

【計算機網絡】面試常考——GET 和 POST 的區別

GET 和 POST 的區別 GET 和 POST 是 HTTP 協議中最常用的兩種請求方法&#xff0c;它們的主要區別體現在 用途、數據傳輸方式、安全性、緩存機制 等方面。以下是詳細對比&#xff1a; 1. 用途 GET POST 主要用于 獲取數據&#xff08;如查詢、搜索&#xff09;。 主要用于 提…

Elastic Security 8.18 和 9.0 中的新功能

作者&#xff1a;來自 Elastic Mark Settle, Tamarian Del Conte, James Spiteri, Tinsae Erkailo, Charles Davison, Raquel Tabuyo, Kseniia Ignatovych, Paul Ewing, Smriti 檢測規則的自動遷移、用于 ES|QL 的 Lookup Join、AI 功能增強&#xff0c;以及更多功能。 Elasti…

gradle-緩存、依賴、初始化腳本、倉庫配置目錄詳解

1.啟用init.gradle文件的方法 在命令置頂文件&#xff0c;例如gradle --init-script yourdir/init.gradle -q taskName,你可以多次輸入此命令來制定多個init文件把init.gradle文件放到USER_HOME/.gradle/目錄下把以.gradle結尾的文件放到USER_HOME/.gradle/.init.d/目錄下把以…

vue3使用<el-date-picker分別設置開始時間和結束時間時,設置開始時間晚于當前時間,開始時間早于結束時間,結束時間晚于開始時間

vue3使用<el-date-picker分別設置開始時間和結束時間時&#xff0c;設置開始時間晚于當前時間&#xff0c;開始時間早于結束時間&#xff0c;結束時間晚于開始時間 為避免出現填寫結束事件后再次修改開始時間&#xff0c;導致開始時間晚于結束時間&#xff0c;添加 change“…

機器學習實操 第一部分 機器學習基礎 第7章 集成學習與隨機森林

機器學習實操 第一部分 機器學習基礎 第7章 集成學習與隨機森林 內容概要 第7章深入探討了集成學習方法&#xff0c;這是一種結合多個預測模型&#xff08;如分類器或回歸器&#xff09;以提高預測性能的技術。這些方法通過利用群體的智慧&#xff0c;可以比單個模型獲得更好…

React Native 開發環境搭建:從零開始

&#x1f90d; 前端開發工程師、技術日更博主、已過CET6 &#x1f368; 阿珊和她的貓_CSDN博客專家、23年度博客之星前端領域TOP1 &#x1f560; 牛客高級專題作者、打造專欄《前端面試必備》 、《2024面試高頻手撕題》、《前端求職突破計劃》 &#x1f35a; 藍橋云課簽約作者、…

機器視覺橡膠制品檢測的應用

橡膠制品在生產過程中易出現劃痕、氣泡、缺料、毛邊、雜質嵌入等多種缺陷&#xff0c;這些缺陷往往微小且隨機分布&#xff0c;人工檢測不僅耗時&#xff0c;漏檢率也居高不下。尤其在汽車密封件、醫療硅膠制品等高端領域&#xff0c;微米級的缺陷都可能導致產品失效&#xff0…

1295.統計位數為偶數的數字

記錄 2025.4.30 題目&#xff1a; 思路&#xff1a; 1.數學觀察&#xff1a;位數不斷減去2&#xff0c;若最后位數為1則為奇數&#xff0c;反正為偶數。 2.庫函數&#xff1a;String.valueOf(int)或Integer.toString(int)函數&#xff08;快速獲得十進制的位數&#xff09;…