STL容器Set的使用

2021-08-11 00:01:49 字數 2093 閱讀 2341

首先了解一下set,我們所知道的set是stl中的乙個容器,但是set實質上也是有不同的版本,我們最根本的劃分就是根據其底層實現分別是紅黑樹和hash表分為兩種,首先這兩種結構最本質的區別就是有序和無序,紅黑樹的儲存是有序的而hash表是無序儲存,但它並不影響set的最主要的用法就是查詢,而從查詢角度來說hash表是更優於紅黑樹,從時間複雜度進行分析,紅黑樹的時間複雜度為o(logn),而hash表的時間複雜度為o(1)。所以說hash表構建的set更高效。所以在對時間要求比較嚴格的情況下,可以優先採用hash表構建的set,即unordered_set。

首先學習set的所有介面和使用方法,介面分為預設的成員函式,迭代器,大小和容量,增刪查改和一些其他函式。

即構造,析構,拷貝構造,賦值運算子等函式,使用方法沒有特殊的要求。

正向迭代器的使用還是常規意義上的使用方法,但是方向迭代器存在一些問題,按照我們規定反向迭代器從最後乙個元素開始,結束應該是第乙個元素的前乙個,但是

從圖上可以看出在呼叫了反向迭代器之後並沒有從最後乙個元素開始,而是從正向迭代器的end()的位置開始的,開啟標頭檔案可以發現反向迭代器直接呼叫了正向迭代器,所以在使用時注意。這可能是編譯器的差異,但是正確來說反向迭代器應該從最後乙個元素開始。

有三個函式,分別是empty(),size(),size_max()。

分別呼叫,然後通過監視得:

empty()函式用來檢查是否為空,size()函式反映了容器元素的個數,而size_max()通過監視是乙個大於一億,小於十億的數,這個函式在某些特殊的場景會使用。

增分為兩種,一是插入元素,二是插入區間。

分別呼叫:

第一種插入元素,即插入乙個同型別的元素到set中,第二個插入乙個元素區間,需要注意的呼叫時的引數必須是乙個同型別的迭代器,而且從下面兩張圖:

可以看出插入區級實際上只是在迴圈呼叫插入單個元素,而且依舊保持著去重的功能。

刪除的函式也是兩種單個和區間,進行呼叫:

未執行前:

第一步:

第二步:

可以看出單個的刪除之後,迭代器會失效,而區間的刪除是乙個左閉右開的結果。

查詢和改變都是用的find()函式,因為find()返回的是乙個迭代器所以改變也需要用到find()函式。

swap()交換函式用來交換兩個set的所有值

clear()刪除set中的所有鍵值

count()用來查詢某個鍵值的值但是set只有關鍵,所以一般還是用來判斷某個鍵值是否存在。

#include

using

namespace

std;

#include

#include

void test()

int main()

(演算法練習) STL容器set的使用

要求 2020.2.20更新 用了find,ac了。事實證明昨天那種簡單粗暴使用新的set將兩個set整合到一起的做法很耗記憶體,雖然省時間,find查詢時間複雜度相對於暴力查詢稍稍優越點,但不必開拓新的空間 難得時間換空間。include include include using namespa...

STL學習之set容器

set容器只是單純的鍵的集合。除了兩種例外情況外,set容器支援大部分的map操作。建構函式 cpp view plain copy explicit set const compare comp compare const allocator allocator template class in...

STL容器之set用法

目錄 一 set容器概念 二 set構造和基本函式介面 三 統計和查詢 set是一種關聯式容器,底層是通過平衡二叉樹 紅黑樹 實現的,插入 刪除和查詢效率都非常高,所有元素插入容器中,會被預設以公升序的形式進行排序,而且不允許插入已經存在且相同的資料元素。此外還有乙個multiset容器,它的底層實...