簡介
- set 是一個內部自動有序且不含重複元素的容器。
- set 最主要的作用就是自動去重並按升序排序,適用於需要去重但是又不方便直接開數組的情況。
- set 中的元素是唯一的,其內部採用“紅黑樹”實現。
注:本文章只列舉 set 在 ACM 中的常見操作,如需瞭解更多有關 set 內容,請參考 C++官方文檔
Set 的基本用法
頭文件 #include <set>
需要使用 std 命名空間 using namespace std;
作用 | 方法 | 說明 |
---|---|---|
定義 set | set<type> s; |
type 可以是任何基本類型或者容器 |
插入元素 | s.insert(x) |
將元素插入到集合中 |
刪除元素 | s.erase(x) |
移除元素 |
查找元素 | s.count(x) |
判斷集合中是否存在該元素 |
獲取元素個數 | s.size() |
不會刪除隊尾元素 |
清空集合 | s.clear() |
刪除集合中所有元素 |
刪除元素及注意事項
//刪除迭代器器iterator指向的元素
erase(iterator);
//刪除迭代器first和second之間的元素
erase(first,second);
//刪除元素x
erase(x);
注意:在迭代器遍歷時刪除元素會使當前迭代器失效!
下面舉例說明: ヾ(•ω•`)o
//錯誤用法:
for(set<int>::iterator it=s.begin();it!=s.end();it++)
{
if(someConditions)s.erase(it);
}
//正確刪除方法一:
for(set<int>::iterator it=s.begin();it!=s.end();)
{
if(someConditions)s.erase(it++);
else it++;
}
//正確刪除方法二:
for(set<int>::iterator it=s.begin();it!=s.end();)
{
if(someConditions)it=s.erase(it);
else it++;
}
二分查找
由於 set 內部元素是有序的,因此可以進行二分查找。
lower_bound(key_value)
返回第一個大於等於key_value的迭代器upper_bound(key_value)
返回最後一個大於等於key_value的迭代器
迭代器類型及用法
set只能通過迭代器遍歷,即遍歷set集合前需先定義一個迭代器:set<type>::iterator it;
然後使用 *it
訪問set中的元素。
//循環輸出set集合中的元素
for(set<int>::iterator it=s.begin();it!=s.end();it++)
{
cout<<*it<<endl;
}
其他類型迭代器:
s.begin()
和s.end()
返回 iterator 類型的迭代器。s.rbegin()
和s.rend()
返回 reverse_iterator 類型的迭代器。s.cbegin()
和s.cend()
返回 const_iterator 類型的迭代器。s.crbegin()
和s.crend()
返回 const_reverse_iterator 類型的迭代器。
注:後兩種迭代器僅在 C++11
以後的標準中可用。
這些迭代器的用法都很相似:
//正常迭代器
for(set<int>::iterator it=s.begin();it!=s.end();it++) cout<<*it<<endl;
//反向迭代器
for(set<int>::reverse_iterator it=s.begin();it!=s.end();it++) cout<<*it<<endl;
//常量迭代器(只能訪問,不可修改)
for(set<int>::const_iterator it=s.begin();it!=s.end();it++) cout<<*it<<endl;
//反向常量迭代器
for(set<int>::const_reverse_iterator it=s.begin();it!=s.end();it++) cout<<*it<<endl;
相關習題詳見: NEFU 大一寒假訓練十二(set)2020.02.18