1. 程式人生 > 其它 >關聯容器——set

關聯容器——set

一、介紹

set中的每一個元素只包含一個關鍵字:set支援高效的關鍵字查詢操作 -> 檢查一個給定的關鍵字是否在set中。

標準庫提供的set關聯容器分為:

  • 按關鍵字有序儲存元素:set(關鍵字即值, 即只儲存關鍵字的容器); multiset(關鍵字可以重複出現的set)
  • 無序集合:unordered_set(用雜湊函式組織的set);unordered_multiset(雜湊組織的set,關鍵字可以重複出現)

set就是關鍵字的簡單集合。當只想知道一個值是否存在時,set是最有用的。

在set中每個元素的值都唯一,而且系統根據元素的值自動進行排序。set中的元素的值不能直接被改變。

set內部採用的是一種非常高效的平衡檢索二叉樹——紅黑樹,也稱為RB樹(Red-Black Tree)。RB樹的統計效能要好於一般平衡二叉樹。

set具備的兩個特點:

  • set中的元素都是排好序的
  • set中的元素都是唯一的,沒有重複的

二、set用法

操作 說明
set s 或者 set s(b, e) 初始化,其中,b 和 e 分別為迭代器開始和結束的標記(其中的引數b大多數情況下是陣列)
begin(); 返回指向第一個元素的迭代器
end(); 返回指向迭代器的最末尾處(即最後一個元素的下一個位置)
clear(); 清除所有元素
count(); 返回某個值元素的個數
empty(); 如果集合為空,返回true
equal_range(); 返回集合中與給定值相等的上下限的兩個迭代器
erase() 刪除集合中的元素
find() 返回一個指向被查詢到元素的迭代器
get_allocator() 返回集合的分配器
insert() 在集合中插入元素
lower_bound() 返回指向大於(或等於)某值的第一個元素的迭代器
key_comp() 返回一個用於元素間值比較的函式
max_size() 返回集合能容納的元素的最大限值
rbegin() 返回指向集合中最後一個元素的反向迭代器
rend() 返回指向集合中第一個元素的反向迭代器
size() 集合中元素的數目
swap() 交換兩個集合變數
upper_bound() 返回大於某個值元素的迭代器
value_comp() 返回一個用於比較元素間的值的函式

示例程式碼:

// begin() 和 end() 的使用
#include<iostream>
#include<set>
using namespace std;

int main(){
    // 先定義一個整型陣列
    int int_array[] = {75, 23, 65, 42, 13, 13, 5, 2, 745, 412, 143};
    // 迭代器開始的位置 int_array 就是陣列首元素的地址
    // 迭代器結束的位置 int_array + 5 就是右移5個位置的地址
    // set<int> int_set(int_array, int_array + 5);
    // 我們換個寫法: sizeof(int_array) / sizeof(*int_array) 的意思: 陣列佔據記憶體空間大小/陣列首元素佔據空間大小 = 有幾個元素, 即陣列的元素個數
    set<int> int_set(int_array, int_array + sizeof(int_array) / sizeof(*int_array));
    cout << "set contains: ";
    for(auto item = int_set.begin(); item != int_set.end(); ++item){
        cout << " " << *item;  // 解引用獲取到item指向的物件值
    }
    cout << "\n";
}

// 輸出結果:
// set contains:  2 5 13 23 42 65 75 143 412 745

// GDB除錯結果:
(gdb) p int_set
$1 = std::set with 10 elements = {
  [0] = 2,
  [1] = 5,
  [2] = 13,
  [3] = 23,
  [4] = 42,
  [5] = 65,
  [6] = 75,
  [7] = 143,
  [8] = 412,
  [9] = 745
}
(gdb) *int_array
Undefined command: "".  Try "help".
(gdb) p *int_array
$2 = 75
(gdb) call(sizeof(*int_array))
$3 = 4
(gdb) call(sizeof(int_array))
$4 = 44