1. 程式人生 > >STL教程之容器--關聯式容器(set/multiset、map/multimap)

STL教程之容器--關聯式容器(set/multiset、map/multimap)

關聯式容器其實就是關聯陣列概念的推廣,依據選定的排序準則,自動為其元素排序。通常關聯式容器是由二叉樹做出來的,每個元素都有一個父節點和兩個子節點,左子樹的所有元素都比自己小,右子樹的所有元素都比自己大。關聯式容器的差別在於元素的型別以及處理重複元素的方式。關聯式容器有一個很大的優點就是提供了對元素的快速訪問,但是卻不能實現任意位置的操作。

1、set/multiset類模板

集合是一種隨機存取的容器,能按順序儲存一組值,其關鍵詞和資料檔案時同一個值,集合物件可以使程式按照次序來儲存一組數值,在一個集合中的元素既作為被儲存的資料又作為資料的關鍵值。集合的本質就是一個有序的排列,集合宣告在標頭檔案< set>內,multiset與set除了set元素中的值必須具有唯一值,即不能包含重複的元素,但是multiset可以包含重複的元素外,其他完全一樣,本文以set為例介紹其用法。set的宣告格式如下:

template < class Key,class Traits=less< Key>,class Allocator< Key> >
class set;

其中引數Key是儲存在集合中元素的型別,引數Traits用於實現集合內部排序的仿函式,預設為less< Key>,即升序,引數Allocator為記憶體配置器,負責記憶體的分配和銷燬。

(1)建構函式

  explicit set(const Traits& _Comp);          
  explicit set(const Traits& _Comp,const Allocator& _All);
  set(const _set& _Right);
  
 tmplate< class InputIterator>
  set(InputIterator first,InputIterator last);
  
  tmplate< class InputIterator>
  set(InputIterator first,InputIterator last,const Traits& _Comp);

  tmplate< class InputIterator>
  set(InputIterator first,InputIterator last,const Traits& _Comp,const Allocator& _All);

上面第一種方法最簡單,定義一個空物件(容器),引數包含了一個謂詞,用於容器的內部排序。第二種形式出包含一個謂詞外,還加入了記憶體配置器引數。第三種形式用已有的set來初始化新的set,第四種形式用first和last指定範圍來初始化新的set。第五種形式比第四種形式多了引數_Comp,從而可以自定義排序規則。第六種形式在第五種形式的基礎上增加了記憶體配置器。

(2)容量、搜尋、統計函式

bool empty( )const;                            /* 判斷set是否為空 */

size_type size( )const;                      /* 獲取set的長度 */

size_type max_size( )const;             /* 獲取set的最大長度 */

size_type count( const Key& _Key )const;   /* 獲取元素_Key的個數*/

iterator find(const Key& _Key)const;/* 返回鍵值為_Key的元素的位置,型別為迭代器 */
const iterator lower_bound(const Key& _Key)const;/* 返回鍵值大於或等於_Key的元素的位置,優先返回間隔最小的元素,型別為迭代器 */

const iterator upper_bound(const Key& _Key)const;/* 返回鍵值大於_Key的元素的位置,型別為迭代器 */

pair< iterator,iterator>equal_range(const Key& _Key)const;/* 函式返回型別為迭代器對(pair),該迭代器對的兩個迭代器分別指向集合中元素鍵值大於並等於引數_Key的第一個元素(first)和集合中鍵值大於引數_Key的第一個元素(second) */
/*例如:std::pair<std::set<int>::iterator,std::set<int>::iterator> p; */

(3)迭代器及賦值函式

void swap(set& str);/* 交換兩set的元素 */
const_iterator begin();/* 返回set的首元素 */
const_iterator end();/* 返回set的尾元素 */
const_reverse_iterator rbegin();/* 返回set的尾元素 */
const_reverse_iterator rend();/* 返回set的首元素 */

(4)插入刪除函式 不能對空集合進行刪除操作,所以在刪除函式前,需要有容器容量判斷。

pair<iterator,bool>insert(const value_type& x);/* 返回值為pair型別的迭代器指標first代表插入元素的位置,第二個為bool型別,表示插入是否成功 */

iterator insert(iterator it,const value_type& x);/* 在集合it位置插入元素x */

void insert(const value_type& first,const value_type& last);/* 插入迭代器first到last之間的元素到集合中 */

iterator erase(iterator it);/* 清除元素it */
iterator erase(iterator first,iterator last);/* 清除迭代器first到last之間的元素 */
size_type erase(const key& key);/* 清除關鍵值為key的元素 */

void clear();/* 清空set集合 */

(5)集合比較函式

key_compare key_comp()const;           /* 鍵值比較函式 */
value_compare value_comp()const;    /* 實值比較函式 */