1. 程式人生 > >C++之STL中set的用法總結

C++之STL中set的用法總結

set概述

和vector、list不同,set、map都是關聯式容器。set內部是基於紅黑樹實現的。插入和刪除操作效率較高,因為只需要修改相關指標而不用進行資料的移動。
在進行資料刪除操作後,迭代器會不會失效呢?刪除set的資料時,實際的操作是刪除紅黑樹中的一個節點,然後相關指標做相關調整。指向其他元素的迭代器還是指向原位置,並沒有改變,所以刪除一個節點後其他迭代器不會失效。list和map也是同樣的道理。然而刪除vector中的某個元素,vector中其他迭代器會失效,因為vector是基於陣列的,刪除一個元素後,後面的元素會往前移動,所以指向後面元素的迭代器會失效。
再稍微說一下迭代器的實現。迭代器是一個物件,vector的迭代器是封裝了陣列下標;list、map、set的迭代器是封裝了元素節點的指標。
還有一點,從數學層面,set的一個集合,好比一個袋子裡面裝了好多個小球。但是紅黑樹是一種特殊的二叉搜尋樹,set中的元素根據其值的大小在紅黑樹中有特定的位置,是不可移動的。所以,1是search操作效率會很高O(log n),2是set中元素的值不可改變。

set的資料操作

::begin()      //迭代器
::end()      //迭代器
::clear()     //刪除set容器中的所有的元素
::empty()    //判斷set容器是否為空
::max_size()  //返回set容器可能包含的元素最大個數
::size()    //返回當前set容器中的元素個數
::rbegin   //逆迭代器
::rend()  //逆迭代器

小問題

set是基於紅黑樹實現的,那麼set的迭代器begin()、end()是指向哪裡的呢?
一個測試程式:

#include<iostream>
#include<set>
using namespace std; int main(){ set<int> myset; myset.insert(4); myset.insert(7); myset.insert(2); myset.insert(0); myset.insert(4); set<int>::iterator it; for(it = myset.begin(); it != myset.end(); it++){ cout<< *it; //輸出結果是:0247 } }

紅黑樹首先是二叉搜尋樹,所以begin()迭代器指向紅黑樹的最左邊的節點,end()迭代器指向紅黑樹的最右邊的節點。另外這個小程式還說明了重複插入無效。