【C++ STL】Set用法

HOWARLI發表於2017-05-23

本文為本蒟蒻僅會的Set用法,求大神指教

Set,C++中的集合函式,採用紅黑平衡樹維護
multiset跟set差不多,但允許一個值出現多次

注意:以下代入的地址begin,end均為左閉右開區間
注意:以下代入的地址begin,end均為左閉右開區間
注意:以下代入的地址begin,end均為左閉右開區間

定義:

set<型別> 變數
可以套用,如:map<int,set<int> >a (注意有空格)
當然也可以:set<int> a(cmd)

常見用法:

a.begin():返回a的所有值中最小值的地址
*a.begin():返回a的所有值中最小的值
a.end():返回a的所有值中最大值後面的地址(左閉右開)
a.count(k):k這個數在集合a中出現了多少次(如果a不是multiset,返回值為0/1)
a.empty():是否為空(等價於a.begin()==a.end()
a.size():返回元素個數(a.count(x)之和)
a.find(k):返回a中k這個元素的地址(沒找到返回end())
a.equal_range(k):返回為一個pair,first是a中第一個大於等於k的數,second是第一個大於k的數
a.lower_bound(k):跟int的一樣用法
a.upper_bound(k):跟int的一樣用法

a.clear():刪除所有元素
a.insert(k):把k這個數插入到a中
a.erase(k):把k這個數從a中刪除(k可以為地址)
a.erase(first,last):把a中地址first到last的元素全部刪掉(不會判地址錯誤)
a.swap(b):把集合a與集合b交換

以上操作複雜度均為log(常數+++),除了insert(begin,end)和erase(begin,end)是O(n)的

詳細用法演示

以下部分來源於這裡,當然也有內容來自於網上各大博主的blog,在此表示感謝

以下程式中的n表示集合中數的個數,m為詢問個數,
執行均在JZOJ的評測機上

equal_range(k)

返回值為pair,first是a中第一個大於等於k的數,second是第一個大於k的數。

#include <cstdio>
#include <cstdlib>
#include <set>
#define fo(i,a,b) for(int i=a;i<=b;i++)
using namespace std;
int n;
set<int> a;
int main()
{
    int q;
    scanf("%d",&n);
    fo(i,1,n)scanf("%d",&q),a.insert(q);
    printf("-------------\n");
    pair<set<int>::const_iterator,set<int>::const_iterator> ans;
    ans=a.equal_range(3);
    printf("%d\n",*ans.first);
    printf("%d\n",*ans.second);
    return 0;
}

執行結果:

5
1 2 3 4 5
-------------
3
4
請按任意鍵繼續. . .

lower_bound(k)和upper_bound(k)

跟普通的一樣意思,返回的是地址

#include <cstdio>
#include <cstdlib>
#include <set>
#define fo(i,a,b) for(int i=a;i<=b;i++)
using namespace std;
int n;
set<int> a;
int main()
{
    int q;
    scanf("%d",&n);
    fo(i,1,n)scanf("%d",&q),a.insert(q);
    printf("------------\n");
    printf("%d\n",*a.lower_bound(3));
    printf("%d\n",*a.upper_bound(3));
    return 0;
}

執行結果

10
1 1 2 2 3 3 4 4 5 5
------------
3
4
請按任意鍵繼續. . .

insert(k)

有2種用法:
a.insert(begin,end):把地址begin~end的全部插入到a中
a.insert(k):把a插入集合a中,返回值為pair<set<int>::iterator,bool>,bool表示插入是否成功(a中是否有這個數),地址則為插入位置,而如果時multiset的話,返回值就只有set<int>::iterator(總是會成功)

相關文章