C++ set,STL set詳解

2020-07-16 10:04:28
set 是關聯容器的一種,是排序好的集合(元素已經進行了排序)。set 和 multiset 類似,它和 multiset 的差別在於 set 中不能有重複的元素。multiset 的成員函數 set 中也都有。

不能直接修改 set 容器中元素的值。因為元素被修改後,容器並不會自動重新調整順序,於是容器的有序性就會被破壞,再在其上進行查詢等操作就會得到錯誤的結果。因此,如果要修改 set 容器中某個元素的值,正確的做法是先刪除該元素,再插入新元素。

使用 set 必須包含標頭檔案 <set>。set 的定義如下:

template < class Key, class Pred = less<Key>, class A = allocator<Key> > class set {...}


由於不能有重複元素,所以 set 中插入單個元素的 insert 成員函數與 multiset 中的有所不同,其原型如下:

pair<iterator, bool> insert(const T & val);

如果 set 的 insert 成員函數的返回值是 pair 模板類物件 x,如果 x.second 為 true,則說明插入成功,此時 x.first 就是指向被插入元素的疊代器;如果 x.second 為 false,則說明要插入的元素已在容器中,此時 x.first 就是指向原有那個元素的疊代器。

關聯容器的 equal_range 成員函數的返回值也是 pair 模板類物件,其原型如下:

pair<iterator, iterator> equal_range(const T & val);

返回值物件中的 first 就是 lower_bound 的值,second 就是 upper_bound 的值。

下面的程式演示了 set 的用法。
#include <iostream>
#include <set>  //使用set須包含此檔案
using namespace std;
int main()
{
    typedef set<int>::iterator IT;
    int a[5] = { 3,4,6,1,2 };
    set<int> st(a,a+5);    // st裡是 1 2 3 4 6
    pair< IT,bool> result;
    result = st.insert(5); // st變成  1 2 3 4 5 6
    if(result.second)    //插入成功則輸出被插入元素
        cout << * result.first  << " inserted" << endl; //輸出: 5 inserted
    if(st.insert(5).second)
        cout << * result.first  << endl;
    else
        cout << * result.first << " already exists" << endl;
    //輸出 5 already exists
    pair<IT,IT> bounds = st.equal_range(4);
    cout << * bounds.first << "," << * bounds.second ;  //輸出:4,5
    return 0;
}
程式的輸出結果是:
5 inserted
5 already exists
4,5