【C++ STL】Set用法
本文為本蒟蒻僅會的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
(總是會成功)
相關文章
- STL:set用法總結
- STL中set用法詳解
- C++ 學習筆記(1):STL、Vector 與 SetC++筆記
- C++ set的一些用法C++
- 《STL原始碼剖析》-- stl_set.h原始碼
- 《STL原始碼剖析》-- stl_hash_set.h原始碼
- STL:map用法總結
- STL:vector用法總結
- STL:list用法總結
- C++ STL listC++
- C++ STL stackC++
- C++ STL -- vectorC++
- C++ STL -- listC++
- C++ STL -- HashTableC++
- STL 優先佇列 用法佇列
- STL中map用法詳解
- C++ 模板與STLC++
- C++ STL deque容器C++
- STL醜數(set+優先佇列)佇列
- 例說資料結構&STL(八)——set資料結構
- 例說資料結構&STL(十)——hash_set/unordered_set資料結構
- 演算法學習之路|用C++刷演算法會用到的STL(二)——set演算法C++
- C++ stl容器詳解C++
- C++ STL之迭代器C++
- C++ STL迭代器(iterator)C++
- C++ STL學習——vectorC++
- C++ STL容器總結C++
- C++ STL簡介 (轉)C++
- C++ STL stack容器——棧C++
- C++ STL第三篇(搞清楚deque原理和有多少用法)C++
- Oracle set unused的用法Oracle
- rman set newname switch 用法
- C++ set and multisetC++
- C++實踐:STL容器reserveC++
- [C++] STL相關面試題C++面試題
- C++ STL學習之stack。C++
- C++ STL list連結串列C++
- Python中set的用法Python