例說資料結構&STL(八)——set
1 白話集合(set)
set容器屬於關聯式容器,與STL另一個容器map一樣容器中包含鍵值對,值不高它的鍵與值都是同一個數。set實現了紅黑樹的平衡二叉檢索樹的資料結構,插入元素時,它會自動調整二叉樹的排列,把元素放到適當的位置,以保證每個子樹根節點鍵值大於左子樹所有節點的鍵值,小於右子樹所有節點的鍵值;另外,還得保證根節點左子樹的高度與右子樹高度相等。
平衡二叉檢索樹使用中序遍歷演算法,檢索效率高於vector、deque和list等容器,另外使用中序遍歷可將鍵值按照從小到大遍歷出來。構造set集合主要目的是為了快速檢索,不可直接去修改鍵值。
此外set和我們數學上學習的集合一樣,容器中不包含重複資料,並且載入的資料會自動進行從小到大排序入集合。
2 STL中set實戰
2.1 包含set的標頭檔案
#include<set>
using namespace std; // std名稱空間,或者std::set< >
2.2 宣告set物件
set<int> set_fir;
2.3 插入元素
set<int> set_fir;
set_fir.insert(1); //插入自動排序
set_fir.insert(set_fir.begin(),10); //插在哪都一樣,都是自動排序
其實我們只要第一種預設插入方式即可,因為新新增的資料無論在哪容器會自動調整set結構來排序。
2.4 邊界元素
set<int>::iterator iter1 = set_fir.lower_bound(2); //返回set中>=2的索引(迭代器),切記不是小於2的有意思
set<int>::iterator iter2 = set_fir.upper_bound(2); //返回set中>2的索引
由於set中鍵和值是同一個值,並且set是自增排序的,所以間接訪問*iter1中的資料就是set中第一個大於或者等於2的值。
2.5 刪除元素
set<int> set_fir;
set_fir.erase(2); //刪除set中元素2
set_fir.erase(set_fir.begin(), set_fir.end()); //清空整個set
2.6 查詢元素
set<int>::iterator iter;
iter=set_fir.find(5); // 查詢鍵值為5的元素
if(iter!=set_fir.end())
cout<<*iter<<endl; // 找到就列印出元素
2.7 迭代器
關聯式容器也可以通過迭代器間接訪問每個元素,迭代器可以象徵性的看成是指標。set和其他能夠使用迭代器的容器一樣,它的迭代器是雙向的,我們可以從頭到尾,也可以從尾到頭訪問每個資料。
#include<iterator>
set<int>::iterator iter; //對應迭代器物件
//從頭到尾間接訪問
for(iter=set_fir.begin();iter!=set_fir.end();iter++)
cout<<*iter<<endl;
從尾到頭有對應的索引:
set<int>::reverse_iterator iter; //對應反向迭代器物件
//從尾到頭間接訪問
for(iter=set_fir.rbegin();iter!=set_fir.rend();iter++)
cout<<*iter<<endl;
上面begin()指向的是set集合中首元素地址,而end()指的是集合中尾部資料的下一位地址。在反向迭代器操作中,rbegin()指向的是set尾部資料,而rend()指向第一個元素前面一個位置的元素(這個元素被認為是反轉後的尾部)。此外,切記上面反轉迭代也是iter++,而不是我們想的iter–,這個過程set內部已經幫忙轉換。
2.8 其他常用操作
set<int> set_fir;
set_fir.count(12); // 返回set中元素的個數,由於set的特殊性,所以結果只有0或者1
set_fir.swap(set_sed); // 交換所有資料,需要確保set中元素型別相同
set_fir.clear(); // 清空集合set_fir
set_fir.size(); // 統計set_fir中元素個數
set_fir.empty(); // 判斷set中是否為空,空則返回1
3 小結
上面介紹了集合資料結構特點以及STL中包含的介面。由於集合是基於紅黑樹構建的資料結構,所以其存取,訪問等時間複雜度都為O(logn),n為集合中元素的個數。
以上是個人學習記錄,由於能力和時間有限,如果有錯誤望讀者糾正,謝謝!
轉載請註明出處:http://blog.csdn.net/fx677588/article/details/76365495
相關文章
- STL:set用法總結
- python資料結構setPython資料結構
- Set和Map資料結構。資料結構
- js資料結構--集合(set)JS資料結構
- ES6 Set 資料結構資料結構
- 資料結構之Set | 讓我們一塊來學習資料結構資料結構
- Java常用資料結構之Set之TreeSetJava資料結構
- STL使用篇__set
- 八大資料結構分類大資料資料結構
- 重學資料結構(八、查詢)資料結構
- 《大話資料結構》讀後總結(八)資料結構
- ES6之Set和Map資料結構資料結構
- 京東雲開發者|Redis資料結構(二)-List、Hash、Set及Sorted Set的結構實現Redis資料結構
- 資料結構與演算法(八):排序資料結構演算法排序
- java八股 併發+資料結構Java資料結構
- 資料結構:線性表-例題資料結構
- 傳說中的資料結構_JAVA資料結構Java
- 資料結構實驗之連結串列八:Farey序列資料結構
- 資料結構與演算法-跳錶《八》資料結構演算法
- 【PG結構】Postgresql資料庫資料目錄說明SQL資料庫
- ES6的Set和Map資料結構,由你製造資料結構
- 每週一練 之 資料結構與演算法(Set)資料結構演算法
- 深入剖析Redis系列(八) - Redis資料結構之集合Redis資料結構
- 從一條資料說起——InnoDB儲存資料結構資料結構
- 說說你對資料結構的理解?有哪些?區別?資料結構
- 資料結構高階--八大排序彙總資料結構排序
- ES6 系列之模擬實現一個 Set 資料結構資料結構
- 結構化資料、半結構化資料和非結構化資料
- 2. STL容器結構與分類
- 【資料結構篇】認識資料結構資料結構
- 【資料結構與演算法】通俗易懂說連結串列資料結構演算法
- 侯捷C++ STL體系結構與原始碼剖析:關於moveable的說明C++原始碼
- C#資料結構與演算法系列(八):棧(Stack)C#資料結構演算法
- 資料結構小白系列之資料結構概述資料結構
- redis--概述,下載&安裝,資料結構,命令操作--string&hash,list,set&sorted set,通用命令Redis資料結構
- 資料結構資料結構
- Redis 5種資料結構及其使用場景舉例--STRINGRedis資料結構
- 【學習】體系結構-001-例項與資料庫資料庫
- Proxy例項set()