1. 程式人生 > >【C++】STL常用容器總結之九:集合set

【C++】STL常用容器總結之九:集合set

10、集合set

Map容器是鍵值對的集合,而set容器只是單純的鍵的集合,當只想知道一個值是否存在時,使用set容器是最合適的。在set中,所有元素都會根據其鍵值被自動排序,同時set中不允許兩個元素有相同的鍵值。

1、set容器的一些操作

Set容器支援大部分的map操作,主要包括以下幾種操作:

1、宣告set物件

set<T> s;  // 建立一個名為s的空set,T是型別名。
set<T> s(s2);  // 建立容器s2的副本s。
set<T> s(b, e);  // 建立s,其元素是迭代器b和e標示的範圍內元素的副本。

2、set的插入操作

s.insert(key_value);
將key_value插入到set中,返回值是pair<set<int>::iterator, bool>,bool標誌著插入是否成功,而iterator代表插入的位置,若key_value已經在set中,則iterator表示key_value在set中的位置。如果key_value不存在,則插入;否則不進行任何操作。
s.insert(iter, key_value);
在指定的迭代器位置插入key_value,返回該迭代器。
s.insert(begin, end);
將迭代器begin到end之間的元素插入到set中,返回值是void。

3、set的訪問操作

s.count(k);
/返回s中鍵值等於k的元素的個數,這個函式在set並不是很實用,因為一個鍵值在set只可能出現0或1次,這樣就變成了判斷某一鍵值是否在set出現過了。
s.find(k);
如果查詢到鍵值k,則返回該鍵值的迭代器位置;否則,返回集合最後一個元素後面的一個位置,即end()。

4、set的刪除操作

s.erase(key_value);  // 刪除鍵值為v的值
s.erase(iter);  // 刪除迭代器iter所指向的元素
s.erase(iterator first, iterator last);  // 刪除兩個迭代器之間的值

Set不支援下標操作,在set容器中value_type不是map的pair型別,而是key_type型別,這就體現了set儲存的元素僅僅是鍵,沒有所關聯的值。與map一樣,set容器儲存的元素必須唯一,而且不能修改。

5、set與大部分容器通用的一些方法:

begin();  // 返回set容器的第一個元素。
end();  // 返回set容器的最後一個元素的下一個位置。
clear();  // 刪除set容器中的所有的元素。
empty();  // 判斷set容器是否為空。
max_size();  // 返回set容器可能包含的元素最大個數。
size();  // 返回當前set容器中的元素個數。
rbegin();  // 返回set容器的最後一個元素。
rend();  // 返回set容器的第一個元素的前一個位置。

2、set和map的區別

STL中:map的節點是一對資料,set的節點是一個數據。
集合set,包含了經過排序了的資料,這些資料的值(value)必須是唯一的。
對映map,是經過排序的二元組的集合,map中的每個元素都是由兩個值組成,其中的key(鍵值,一個map中的鍵值必須是唯一的)在排序或搜尋時使用,它的值可以在容器中重新獲取;而另一個值是該元素關聯的數值。
Map是對映,集合中的元素不能重複;set可以進行集合的各種操作(交併補等),當然你也可以用list或vector實現set,但是效率會很低。Set一般是用平衡樹或雜湊表實現的。對映是一種一一對應的關係,雜湊表也可以看作是對映的一種。對映通常可用來實現字典結構。