例說資料結構&STL(八)——set

無鞋童鞋發表於2017-07-30

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

相關文章