STL中與比較器有關的容器和演算法

2021-05-22 22:10:16 字數 2477 閱讀 5868

一. set:包含了經過排序了的資料,這些資料的值(value)必須是唯一的。 

對集合a中元素的有

插入元素:a.insert(1);

刪除元素(如果存在):a.erase(1);

判斷元素是否屬於集合:if (a.find(1) != a.end()) ...

返回集合元素的個數:a.size()

將集合清為空集:a.clear()

集合的並,交和差

set_union(a.begin(),a.end(),b.begin(),b.end(),insert_iterator>(c,c.begin()));

set_intersection(a.begin(),a.end(),b.begin(),b.end(),insert_iterator>(c,c.begin()));

set_difference(a.begin(),a.end(),b.begin(),b.end(),insert_iterator>(c,c.begin()));

(注意在此前要將c清為空集)。

對於內建型別如int, double, float, string等,比較器以及輸入輸出操作符是系統已經定義好的;對於class, struct等型別,比較器即輸入輸出操作符都需重新寫;如struct teacher裡面定義了比較器及過載輸出操作符;

set裡面的元素有序且唯一,在預設的情況下,是按從小到大排序的;如果想讓元素從大到小排序,則需要在定義集合時,模板引數中需加greater比較器,而且這裡的引數是結構體本身,因此是greater,而不是物件greater();但是在sort函式中的比較器,則是物件。

二. 輸入輸出重新定向

三. priority_queue: 優先佇列

t:存放容器的元素型別

sequence:實現優先順序佇列的底層容器,預設是vector

compare:用於實現優先順序的比較函式,預設是functional中的less

empty()  如果優先隊列為空,則返回真 

pop()  刪除第乙個元素 

push()  加入乙個元素 

size()  返回優先佇列中擁有的元素的個數 

top()  返回優先佇列中有最高優先順序的元素 

priority_queue放置元素時,不會判斷元素是否重複。(因為在模板的第二個引數是順序容器,不能保證元素的唯一性)

預設情況下(預設比較器是less),大的優先,即按順序輸出是從大到小的;

若要從小到大輸出,則在定義優先佇列物件時,模板引數上要加大於比較器;由於優先佇列模板引數有三個,所以若加比較器作為引數,則第二個引數也不能省,一般就用預設的vector<>;

優先佇列預設的情況是從大到小的順序,而sort, binary_search 以及set 預設的都是從小到大排序的。

此**輸出結果為: 25, 15, 10, 5;

下面講有關排序方面的4個演算法:

一. sort

二. binary_search: 二分搜尋法,要求容器是從小到大排序的,若從大到小排序了,它會找不到;它返回的是乙個bool值,表示有沒有找到

若sort(datas.begin(), datas.end(), greater());//將datas從大到小排序

bool temp = binary_search(datas.begin(), datas.end(), 0); //返回0,即沒有找到,此種情況下,可以將迭代器反過來,即

bool temp = binary_search(datas.rbegin(), datas.rend(), 0); //這樣就相當於又是對從小到大排序的陣列進行操作了

三. unique: 保證數的唯一性,但是不能保證數的有序;返回乙個迭代器,指向資料唯一的末端。

或者 四. unique_copy: 保證數的唯一性,並執行拷貝操作

注意: datas中有元素1000個,經過唯一化後,元素必然小於等於1000;所以當afterunique空間賦予過大時,後面的元素將會用0補;

back_inserter() 它使用容器的push_back()插入操作,如 unique_copy( ivec.begin(), ivec.end(),back_inserter( afterunique );//現在用 afterunique.push_back()

插入front_inserter() 它使用容器的push_front()插入操作,但是注意vector 類不支援push_front()

inserter() 它呼叫容器的insert()插入操作代替賦值操作符inserter()要求兩個實參

STL 中各容器的比較

list支援快速的插入和刪除,但是查詢費時 vector支援快速的查詢,但是插入費時。map查詢的時間複雜度是對數的,這幾乎是最快的,hash也是對數的。如果我自己寫,我也會用二叉檢索樹,它在大部分情況下可以保證對數複雜度,最壞情況是常數複雜度,而std map在任何情況下都可以保證對數複雜度,原因...

STL中map與hash map的比較

stl中map與hash map的比較 map c 的stl中map是使用樹來做查詢演算法 時間複雜度 o log2n hash map 使用hash表來排列配對,hash表是使用關鍵字來計算表位置 時間複雜度 o 1 最壞的時間複雜度 o n 總體來說 hash map 比 map 查詢速度快,而...

STL容器中size和capacity的區別

size 表示當前容器中元素的個數 capacity 表示當前容器在必須分配新的儲存空間之前允許存放元素的個數 與size對應的函式是resize n 它的作用是調整容器的大小使其能夠容納n個元素,如果n小於當前容器的size,則刪除多餘的元素。如果n大於當前容器的size,則新增初始化後的元素。r...