來學STL(2) set (初階)使用(持續更新)

2021-10-20 12:38:56 字數 3657 閱讀 9964

按需求抓重點。收藏起來

最後一次更新與3月2日

vector容器

所有元素都會根據元素的鍵值自動排序,set元素的鍵值就是實值,實值就是鍵值。set不允許兩個元素有相同的鍵值。(set的元素不像map那樣可以同時擁有實值(value)和鍵值(key))。(來自)

換而言之,就是一種集合,這個容器裡面不會出現重複的元素,而且自動給你排序。排序從小到大。

如果不追求更多使用方法,只是簡單了解,請閱讀下面的**和總結。

注:其中迭代器的用法可跳轉《stl加餐–迭代器的使用(初階)–持續更新》

#include

#include

using

namespace std;

intmain()

// 遍歷set

set<

int>

:: iterator it ;

//申請乙個set的迭代器

for(it = s.

begin()

;it != s.

end();

++it)

cout<<

"s.size() = "

//再次加入元素1 2 3 4 5

for(

int i =

1;i<=

5;i++)

cout<<

"s.size() = "

return0;

}

執行結果

123

45s.size()

=5s.size()

=5

小解讀由上面**我們可以看到set的兩個功能:

1.set是乙個無重複元素的集合,也就是會自動去除重複的元素。

2.set可以自動為我們排序,預設排序為公升序。(高階的排序這裡不做講解)

set的複雜度要比vector小,沒有那麼多的構造賦值什麼的,所以直接將函式即可。

函式如下。

insert() 加入元素(插入元素)

size()     返回當前set容器中的元素個數

begin()    返回set容器的第乙個元素

end()      返回set容器的最後乙個元素

clear()    刪除set容器中的所有的元素

empty()    判斷set容器是否為空

count() 用來查詢set中某個鍵值出現的次數

erase() 刪除元素

小總結:

1.set加入元素不像vector一樣可以像使用陣列一樣加入元素,最方便利用insert插入元素。

2.begin()和end()的用法和vector差不多,但是注意set裡面的begin()和end()不支援『+'和 『-』運算子(自增自減可以),申請的迭代器也不行,也就數說,出現下面**會報錯

s.

begin()

+1;s.

begin()

-1;s.

end()-

1;set<

int>

:: iterator ite = s.

begin()

+2;ite = ite +2;

...等等相關操作

簡單函式在原始****現過,所以不做過多講解。

count()函式會返回某個鍵值(就是元素)出現的次數,由於set的去重特定,如果有某個元素,就只會返回1,如果沒有,返回0。詳情看**(省略標頭檔案)。

s.

insert(1

);s.insert(2

);s.insert(4

);s.insert(3

);s.insert(1

);//重複插入1

cout<<

"s.count(1) = "

)

cout<<

"s.count(0) = "

)

執行結果

1

0

erase()的三種常用原形

1.erase(iterator) ,刪除定位器iterator指向的值(刪除這個位址的元素)

2.erase(first,second),刪除定位器first和second之間的值(刪除位址從first到second的元素(注意不包括second位址的元素))

3.erase(key_value),刪除鍵值key_value的值()

具體適用方法請看**

set<

int> s;

//加入元素10 9 8 7 6 5 4 3 2 1

for(

int i =

10;i>=

1;i--

)//申請乙個迭代器

set<

int>

:: iterator it;

//第一種刪除

s.erase

(s.begin()

);//刪除第乙個元素 1;

cout<<

"第一次刪除的結果為:"

;for

(it = s.

begin()

; it != s.

end();

++it)

cout

s.erase

(s.begin()

,++s.

begin()

);//在上面刪除的基礎上刪去元素 2(因為不包括位址++s.begin()的元素,所有只能刪掉乙個元素)

cout<<

"第二次刪除的結果為:"

;fprintf

("text.txt",)

for(it = s.

begin()

; it != s.

end();

++it)

cout

s.erase(5

);//刪除集合裡的 5

cout<<

"第三次刪除的結果為:"

;for

(it = s.

begin()

; it != s.

end();

++it)

cout<

第一次刪除的結果為:234

5678

910第二次刪除的結果為:345

6789

10第三次刪除的結果為:346

78910

持續更新…(如有問題歡迎指正)

STL2 順序容器

操作 1.swap c1,c2 或c1.swap c2 交換c1和c2中元素,c1和c2型別必須相同,它比c2向c1拷貝元素快得多。2.seq.assign b,e 將seq中的元素替換為迭代器b和e表示範圍內的元素。seq.assign n,t 將seq中的元素替換為n個t。assign操作不適合...

王小明學STL2

大叔!你騙我。王小明找上了大叔,憤憤不平。我怎麼騙你了?大叔正無聊地翻著一本早被翻爛的書。你騙我用stl,我去網上查了,很多人都說stl慢!慢的很 你是怎麼知道他慢的?你昨天不是教我用vector嗎?我回去用陣列和它比較了一下,發現比陣列插入的速度慢了好多!你是怎麼試驗的?你看,我是這樣寫的。說著,...

stl 2 初始容器迭代器演算法

include std cout std endl 螢幕輸出需要的標頭檔案 include vector容器和vector迭代器需要的標頭檔案 include for each演算法需要的標頭檔案 宣告乙個for each演算法需要用到的 函式 void myprint int v int main...