C++set
1. 關聯式容器
vector、list、deque、forward_list(C++11)等STL容器,其底層為線性序列的數據結構,里面存儲的是元素本身,這樣的容器被統稱為序列式容器。而map、set是一種關聯式容器,關聯式容器也是用來存儲數據的,與序列式容器不同的是,關聯式容器里面存儲的是<key, value>結構的鍵值對,在數據檢索時比序列式容器效率更高。map和set的鍵是唯一的,但是mutimap和multiset支持多個同名且有不同映射的鍵共存。
2. 鍵值對
用來表示具有一一對應關系的一種結構,該結構中一般只包含兩個成員變量key和value, key代表鍵值,value表示與key對應的信息。比如:學生的姓名和他的學號是一一對應的,那么就可以通過查找學生的姓名來查找到對應的學號。set容器是Key結構。set不允許存在相同的key(multiset除外),且key不可修改(因為會破壞內部的紅黑樹結構)。
3.set容器
形參含義:
T:鍵值對應value的類型
Compare:比較器的類型,缺省情況下按照小于來比較,一般情況下(內置類型元索)該參數不需要傳遞,如果無法比較時(自定義類型),需要用戶自己顯式傳遞比較規則(一般情況下按照函數指針或者仿函數來傳遞)
Alloc:通過空間配置器來申請底層空間,不需要用戶傳遞,除非用戶不想使用標準庫提供的空間配置器
4.set的成員函數
4.1 map的成員函數介紹
set的構造:
函數聲明 | 功能介紹 |
---|---|
sets() | 構造一個空的set |
set的迭代器:
函數聲明 | 功能介紹 |
---|---|
begin()和end() | begin:首元素的位置;end:下一個元素的位置 |
cbegin()和cend() | c指const,cbegin和cend指向的內容不能修改 |
rbegin()和rend() | 反向迭代器,rbegin從end開始,rend從begin開始,其++和–的方向相反 |
crbegin()和crend() | 與前一個功能相同,但指向的內容不能修改 |
set的容量與元素訪問:
函數名 | 函數聲明 | 功能介紹 |
---|---|---|
empty | bool empty() const | 檢測set中的元素是否為空,為空返回ture,不為空返回false |
size | size_type size() const | 返回set中有效元素的個數 |
set的修改:
函數名 | 函數聲明 | 功能介紹 |
---|---|---|
insert | pair<iterator,bool> insert (const value_type& val) | 在set中插入鍵值對x,注意x是一個鍵值對,返回值也是鍵值對;iterator代表新插入元素的位置,bool代表插入成功 |
erase | void erase (iterator position) | 刪除position位置上的元素 |
size_type erase (const value_type& val) | 刪除鍵值為x的元素 | |
void erase (iterator first, iterator last) | 刪除**[first,last)**區間中的元素 | |
swap | void swap (set& x) | 交換兩個set中的元素 |
clear | void clear() | 刪除set里所有的元素 |
set的比較:
函數名 | 函數聲明 | 功能介紹 |
---|---|---|
key_comp | ||
value_comp |
set的操作:
函數名 | 函數聲明 | 功能介紹 |
---|---|---|
find | iterator find (const value_type& val) const | 搜索set里鍵等于k的元素,如果找到返回一個映射的迭代器,找不到返回end的迭代器,find函數默認查找中序的第一個相等的值 |
count | size_type count (const value_type& val) const | 搜索set里鍵等于k的元素,找到返回1,找不到返回0 |
lower_bound | iterator lower_bound (const value_type& val) const | 在set里找>=k的元素,返回符合情況的最小鍵的迭代器 |
upper_bound | iterator upper_bound (const value_type& val) const | 在set里找>k的元素,返回符合情況的最小鍵的迭代器 |
equal_range | pair<iterator,iterator> equal_range (const value_type& val) const |
5. multimap和multiset
mutiset(map)相等的值可以在左孩子也可以在右孩子(會調整樹的結構,無所謂插在哪里)。