STL學習記錄(八)Sets Multisets

2021-07-02 18:46:52 字數 3923 閱讀 3940

set和multiset會依據一定的排序準則自動的將容器裡面的元素進行排序。這也就表明關聯容器與順序容器的乙個最大不同就是元素的順序與元素插入容器的先後無關。set、multiset的不同在於前者不允許容器內部有相同的元素,而後者則是允許的。因為容器對元素進行自動排序,這就表明set、multiset中的元素型別必須是可以進行比較的,或者說其中的元素有自己的比較準則。使用這兩個容器的時候都要包含標頭檔案< set >

容器的類模板定義如下:

namespace

std

改模板中的第二個引數定義了元素的排序策略,預設情況下採用<,第三個引數定義了記憶體模型,預設情況下為c++標準庫的allocator模型

set和multiset的實現就像資料中的二叉平衡樹,並且該二叉樹還是排序樹。從這個資料結構中我們就可以了解到它們最大的乙個優勢:在搜尋特定值的元素時會比一般的線性搜尋時間會短很多,尤其是在資料量非常大的時候更為明顯。但是自動排序功能也給set和multiset造成了乙個很大的限制:不能去更改容器裡元素的值。因為元素的位置是在元素進入容器時根據元素的值確定的,你改變了元素的值將使得該元素在乙個不正確的位置上。因此你要改變某個元素的值,可以採用:先刪除該元素,然後插入新元素(從這個角度來看的話,可以「認為」容器的元素都是const型別的)。

內部結構說明圖

常用類:

操作說明

c.size( )

返回c裡面元素的個數

c.empty( )

判斷c是否為空

c.max_size( )

返回c的最大的容量

c.key_comp( )

返回比較策略

c.value_comp( )

返回元素值得比較策略(與上面操作相同)

c1.swap(c2)

交換c1、c2中的資料

swap(c1,c2)

交換c1、c2中的資料

迭代器類:

操作說明

c.begin( )

返回c的第乙個元素的雙向迭代器

c.end( )

返回c的最後乙個元素之後位置的雙向迭代器

c.cbegin( )

返回c的第乙個元素的const型雙向迭代器

c.cend( )

返回c的最後乙個元素之後位置的const型雙向迭代器

c.rbegin( )

返回c逆序的第的第乙個元素的反向迭代器

c.rend( )

返回c逆序的最後乙個元素的反向迭代器

c.crbegin( )

返回c逆序的第乙個元素的const型反向迭代器

c.crend( )

返回c逆序的最後乙個元素的const型反向迭代器

插入、移除元素:

操作說明

c.clear( )

刪除c中的所有元素

c.erase(val)

刪除元素值為val的所有元素,並返回刪除的個數

c.erase(pos)

刪除位於pos的元素,並返回下乙個元素的位置

c.erase(beg,end)

刪除位於[beg,end)之間的元素,並返回下乙個元素的位置

c.emplace(args…)

將用引數args…初始化的元素插入到c中並返回該元素的位置c++11

c.emplace_hint(pos,args…)

將引數args…初始化的元素插入到c中並返回該元素的位置(pos指明了從**開始搜尋該位置)

c.insert(pos,val)

在pos之前插入val的拷貝並返回該元素的位置(pos指明了從**開始搜尋該位置)

c,insert(val)

插入val的乙個拷貝,並返回新插入元素的位置

c.insert(beg,end)

將[beg,end)之間的元素插入到c中不返回任何東西)

c.insert(*

將列表*中所有元素的拷貝插入到cz中(不返回任何東西)

需要注意的是插入函式insert()和emplace( )的返回型別的差別:

//set中的介面:

pairinsert(const value_type& val);

iterator insert(const_iterator poshint, const value_type& val);

templatepairempalce(args&&... args);

templateiterator emplace_hint(const_iterator poshint,args&&... args);

//multiset中的介面:

iterator insert(const value_type& val);

iterator insert(const_iterator poshint, const value_type& val);

templateiterator empalce(args&&... args);

templateiterator emplace_hint(const_iterator poshint,args&&... args);

這裡返回型別的差別是因為multiset允許有重複值而set不允許。因此set插入乙個元素的時候可能會失敗,所以set返回的型別使用了pair結構。pair結構中第乙個引數返回的是新插入元素的位置或者已有元素的位置,第二個引數返回的是是否插入成功(標明了第乙個引數是新插入元素的位置還是已有元素的位置)

一些特殊的搜尋操作:操作

說明c.count(val)

返回元素值為val的元素個數

c.find(val)

返回第乙個元素值為val的元素的位置

c.lower_bound(val)

返回第乙個val插入c中時的可能位置,也就是第乙個》=val元素的位置

c.upper_bound(val)

返回最後乙個val插入c中時的可能位置,也就是第乙個》val元素的位置

c.equal_range(val)

返回所有元素值為val的元素的位置範圍

**示例1:

#include

#include

using

namespace

std;

int main( )

); coll.insert(5);

for(int elem : coll)

cout

if(status_3.second)

cout

<

cout

<

<

<1

/返回該元素的位置

auto status_4 = coll.insert(4);

if(status_4.second)

cout

<

cout

<

<

<1

<3);

cout

<

<1

0;}

程式輸出為:

6 5 3 2 1

3 already exists

3 at 3

4 insert as new element

4 at 3

after insert 4, 3 at 4

python學習記錄(八)

0910 python異常 python用異常物件 exception object 來表示異常情況。遇到錯誤後。會引發異常。如果異常物件未被處理或捕捉,程式就會用所謂的回溯 traceback,一種錯誤資訊 終止執行 1 0 traceback most recent call last file...

c 學習記錄之STL

總結想再系統學習一下c 搭建這個筆記架構,長期更新 btw想每天更新一下 如果有錯誤地方,煩請多多指教。在學習過程中,也希望能養成良好的 習慣,主要就是按照華為 風格來碼 良好的 風格很重要,我們都要逐漸養成 stl standard template library,標準模版庫 是惠普實驗室開發的...

C 學習記錄之STL函式

1 排序函式 sort 對給定區間所有元素進行排序 stable sort 對給定區間所有元素進行穩定排序 partial sort 對給定區間所有元素部分排序 partial sort copy 對給定區間複製並排序 nth element 找出給定區間的某個位置對應的元素 is sorted 判...