STL學習筆記7 容器set和multiset

2021-09-30 14:39:59 字數 4136 閱讀 7878

在標頭檔案中定義

namespace

std

set和multiset都是關聯容器,是有序的集合,集合中包含不可重複的、型別為key的元素。排序通過使用型別為compare的比較函式比較來實現。搜尋,刪除和插入操作具有對數時間複雜度。set和multiset通常都以紅黑樹實現。multiset相對set來說能夠允許重複值的存在。

set和multiset不提供用來直接訪問元素的任何操作函式

通過迭代器進行元素間訪問,有乙個限制:從迭代器角度看,元素值是常數。

set c //預設建構函式;建立乙個空set/multiset

set c(op) //建立乙個空set/multiset,並以op原則作為排序準則

set c(c2) //複製建構函式;建立乙個新的set/multiset作為c2的副本(所有元素都被複製)

set c = c2 //複製建構函式;建立乙個新的set作為c2的副本(所有元素都被複製)

set c(rv) //移動建構函式;使用右值物件rv建立乙個新set/multiset

set c = rv //移動建構函式;使用右值物件rv建立乙個新set/multiset

set c(beg,end) //建立乙個set/multiset,並使用beg到end範圍內的值進行初始化

set c(beg,end,op) //建立乙個set/multiset,並使用beg到end範圍內以op原則排序後的值進行初始化

set c(initlist) //建立乙個set/multiset,並使用初始化列表進行初始化

set c = initlist //建立乙個set/multiset,並使用初始化列表進行初始化

c.~set() //銷毀所有元素並釋放記憶體

在這裡set可能是如下的一種:

set

//以less<>為排序準則的set

set//以op為排序準則的set

multiset

//以less<>為排序準則的multiset

multiset

//以op為排序準則的multiset

c.key_comp() //返回比較準則

c.value_comp() //返回對值比較的標準 (與

key_comp()相同)

c.empty() //判斷容器是否為空,與size()==0相同,但可能更快

c.size() //返回當前元素數量

c.max_size() //返回可容納的元素最大數量

c1 == c2 //判斷c1與c2是否相等

c1 != c2 //判斷c1與c2是否不相等,等同於!(c1==c2)

c1 < c2 //判斷c1是否小於c2

c1 > c2 //判斷c1是否大於c2

c1 <= c2 //判斷c1是否小於等於c2

c1 >= c2 //判斷c1是否大於等於c2

c.count(val) //返回值為val的元素個數

c.find(val) //返回第乙個值為val的位置,若沒找到返回end()

c.lower_bound(val) //返回val值的第乙個可插入的位置,也就是元素值 >= val的第乙個元素位置

c.upper_bound(val) //返回val值的最後乙個可插入的位置,也就是元素值 > val的第乙個元素位置

c.equal_range(val) //返回val值可插入的第乙個位置和最後乙個位置的區間,也就是元素值 == val的元素區間

c = c2 //將c2所有元素賦值給c

c = rv //將右值物件rv的所有元素移動賦值給c

c = initlist //使用初始化列表進行賦值

c1.swap(c2) //交換c1和c2的數

swap(c1,c2) //交換c1和c2的數

c.begin() //返回乙個雙向迭代器,指向第乙個元素

c.end() //返回乙個雙向迭代器,指向最後乙個元素

c.cbegin() //返回乙個雙向常迭代器,指向第乙個元素

c.cend() //返回乙個雙向常迭代器,指向最後乙個元素

c.rbegin() //返回乙個逆向迭代器,指向逆向迭代的第乙個元素

c.rend() //返回乙個逆向迭代器,指向逆向迭代的最後乙個元素

c.crbegin() //返回乙個逆向常迭代器,指向逆向迭代的第乙個元素

c.crend() //返回乙個逆向常迭代器,指向逆向迭代的最後乙個元素

c.insert(val) //插入乙個val的副本,返回新元素位置(對set來說不論成功與否)

c.insert(pos,val) //插入乙個val副本,返回新元素位置(pos應該是插入的搜尋起點)

c.insert(beg,end) //將範圍beg到end的所有元素的副本插入到c(無返回值)

c.insert(initlist) //插入初始化列表的所有元素的副本(無返回值)

c.emplace(args...) //插入乙個使用args初始化的元素副本,返回新元素位置(對set來說不論成功與否)

c.emplace_hint(pos,args...) //插入乙個使用args初始化的元素副本,返回新元素位置(pos應該是插入的搜尋起點)

c.erase(val) //移除所有與val值相等的元素,並返移除的元素個數

c.erase(pos) //移除迭代器位置的元素,並返回下個元素的位置

c.erase(beg,end) //移除beg到end範圍內的所有元素,並返回下個元素的位置

c.clear() //移除所以元素,清空容器

#include 

#include

#include

#include

using

namespace

std;

int main()

); coll1.insert(5);

//輸出元素

for (int elem : coll1)

cout

<< endl;

//插入4並處理返回值

auto status = coll1.insert(4);

if (status.second)

else

//把coll1以增序賦值給coll2

set coll2(coll1.cbegin(),coll1.cend());

//輸出元素

copy (coll2.cbegin(), coll2.cend(),

ostream_iterator(cout," "));

cout

<< endl;

//刪除3之前的所有元素

coll2.erase (coll2.begin(), coll2.find(3));

//刪除所有值為5的元素

int num;

num = coll2.erase (5);

cout

<< num << " element(s) removed"

<< endl;

//輸出元素

copy (coll2.cbegin(), coll2.cend(),

ostream_iterator(cout," "));

cout

<< endl;

return

0;}

654

3214 already exists12

3456

1element(s) removed34

6

C 學習筆記 STL常用容器 set和map

set 所有元素在插入時自動排序,底層結構用二叉樹實現。set和multiset的區別 set不允許容器中有重複的元素,multiset允許容器中有重複的元素。set構造和賦值 構造 預設建構函式 setst 拷貝建構函式 set const set st 賦值 過載等號操作符 set operat...

STL學習之set容器

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

STL 排序容器multiset和set用法詳解

前言 希望在大量資料中進行的元素增加 刪除 查詢都在log n 複雜度內完成,排序 二分查詢顯然不可以,因為新加入資料就要進行重新排序。而使用 平衡二叉樹 資料結構存放資料就可以達到目的,在stl中體現為以下四種排序容器 multiset set multimap map。標頭檔案 include ...