C++ Set(集合)

簡介

  • 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

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章