STL容器之 set 原理,成員函式

2021-10-23 10:08:01 字數 3621 閱讀 5053

不可以加減運算,只能遞增遞減,因為記憶體不連續

成員方法

自定義set的排序函式

因為是二叉樹,且是比較平衡的二叉查詢樹,所以查詢效率自然是很好的,o

(log⁡n

)o(\log n)

o(logn

),用的是二分查詢

隨著元素數目的增多,即橫座標x增大,縱座標,即查詢次數y

=log⁡2

xy=\log_2 x

y=log2​x

,增大的越來越緩慢,所以集合不擔心元素過多。

這是記憶體不連續的容器的共同好處,因為大家都是用的鍊錶的方式,不會遇到記憶體不夠了再開一塊更大記憶體集體搬家的情況。而連續記憶體的vector, deque等就有可能集體搬家,於是造成迭代器失效。

因為set和map等用的是紅黑樹,即高度平衡的二叉查詢樹,本質是用鍊錶的方式儲存的(二叉鍊錶),所以不會遇到記憶體不夠用又重新開一塊大記憶體然後集體搬家的情況,而vector的push_back就有可能造成這種情況,所以效率低一些。

鍊錶的插入本就是o(1)複雜度,平衡二叉樹的插入是o(log n)複雜度,因為最多比較log n次。

原來只有記憶體連續的容器的迭代器可以加減,雙端佇列的底層用的vector實現,所以也是連續記憶體,不是用鍊錶實現的,注意哦。

原來++i和i++是這麼個區別,那效率差別還是很大的呢。i++加完了以後,要返回臨時物件,但是返回的臨時物件又不賦值所以無用,就會被立即銷毀,所以還不如直接用++i,返回引用的效率高得多。

;//可以用內建陣列初始化

size_type erase (

const value_type & val)

;//刪除 set 容器中值為 val 的元素,返回值為乙個整數,表示成功刪除的元素個數

iterator erase (const_iterator position)

;//刪除 position 迭代器指向的元素

//返回迭代器指向的是 set 容器中刪除元素之後的第乙個元素

iterator erase (const_iterator first, const_iterator last)

;//刪除 [first,last) 區間內的所有元素

//返回迭代器指向的是 set 容器中刪除元素之後的第乙個元素

//注意第二個引數last指向的元素不會刪除

使用示例程式

#include

#include

using

namespace std;

void

showset

(const std::set<

int>

& s)

intmain()

;//初始化

showset

(s);

int n = s.

erase(3

);//第一種原型,刪掉元素3

showset

(s);

cout <<

"n = "

<< n << endl << endl;

auto it1 = s.

erase

(s.cbegin()

);//第二種原型

showset

(s);

cout <<

"*it1 = "

<<

*it1 << endl << endl;

auto it2 = s.

erase

(s.cbegin()

,--s.

cend()

);//第三種原型,注意第二個引數指向的元素不會刪除,如果傳入的第二個引數不是--s.end()而是s.end(),則set的元素會被全部刪掉

showset

(s);

cout <<

"*it2 = "

<<

*it2 << endl;

return0;

}

1 2 3 4 5

s.size(

)= 5

1 2 4 5

s.size(

)= 4

n = 1

2 4 5

s.size(

)= 3

*it1 = 2

5s.size(

)= 1

*it2 = 5

注意我的**裡用了cbegin(),但是這並不能阻止他指向的元素被刪除

我們自己定義排序函式,需要寫乙個結構體(相當於類,用class關鍵字也可以),在裡面定義乙個過載圓括號運算子的const成員函式,由於只是排序,不改動元素,所以傳入的兩個引數都設定為const引用。

自己寫個性化的排序定義,返回值是bool型別,return的條件就是排序的說明方法

#include

#include

#include

using

namespace std;

struct intcomp };

struct strcomp};

intmain()

; set<

int, intcomp>

s1(a, a +5)

;for

(auto it = s1.

cbegin()

; it != s1.

cend()

; it++

) cout << endl;

string b=

; set

s2(b, b +5)

;for

(auto it = s2.

cbegin()

; it != s2.

cend()

; it++

) cout << endl;

system

("pause");

return0;

}

50 40 30 20 10

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容器,它的底層實...

STL容器的常用成員函式

一 vector deque 唯二支援隨機訪問的容器 1.插入 v.push back 5 v.insert it,5 在制指定位置插入 v.insert p,n,t 在p迭代器位置插入n個t v.insert p,b,e 在p迭代器位置插入b迭代器和e迭代器之間的元素 dq.push front ...