set 是數學中“集合”概念的實現,故 set 中不會存在任意兩個相同的元素。
定義
set<int> set_1
初始化
由於 set 中不允許有重複的元素,故 set 對象只接受列表初始化(C11 標準支持),如
set<int> set_1={ 1, 2, 3 };
如列表中有重複的值,set 對象中只會保留其中的一個
set<int> set_1 = { 1, 2, 3, 1 };//set_1 = { 1, 2, 3 }
常用操作
添加元素
1、插入一個元素
set_1.insert(4);
2、插入一個元素列表
set_.insert({ 4, 5, 6 })
3、插入另一個容器中的一段元素
set<int> set_1 = { 1, 2, 3 };
set<int> set_2 = { 4, 5, 6 };
set_1.insert(set_2.begin(), set_2.end());//set_1 = { 1, 2, 3, 4, 5, 6 }
刪除元素
1、刪除一個元素
set<int> set_1 = { 1, 2, 3 };
set_1.erase(1);//set_1 = { 2, 3 }
2、通過迭代器刪除一個元素
set<int> set_1 = { 1, 2, 3 };
set_1.erase(set_1.begin());//set_1 = { 2, 3 }
3、刪除一個由迭代器指定的範圍
set<int> set_1 = { 1, 2, 3 };
set_1.erase(set_1.begin(), set_1.begin()+2);//set_1 = { 3 }
訪問元素
1、訪問單個元素
由於 set 本身的特殊性,對 set 中元素的訪問即是考察某個元素是否在 set 對象中。
set<int> set_1 = { 1, 2, 3 };
auto it_1 = set_1.find(1);//it_1 = set_1.begin()
auto it_2 = set_1.find(4);//it_2 = set_1.end()
set 對象的成員函數 find,返回待查找元素對應的迭代器,若帶查找的元素不在 set 對象中,則返回其尾後迭代器 end()
set.lower_bound(k) 返回第一個大於或等於 k 的元素的迭代器
set.upper_bound(k) 返回第一個大於 k 的元素的迭代器
set<int> set_1 = { 1, 2, 3, 4 }; auto it_1 = set_1.lower_bound(2);//*it_1 = 2; auto it_2 = set_2.upper_bound(2);//*it_2 = 3;
2、遍歷元素
由於 set 是數學中“集合”概念的實現,故 set 對象中的元素也具有“無序性”,此處的“無序性”是指我們無法像訪問數組一樣通過下標來訪問的 set 中的元素。遍歷 set 對象中的元素需要通過迭代器
set<int> set_1 = { 1, 2, 3, 4, 5 };
for(auto it = set_1.begin(); it! = set_1.end(); it++)
cout << *it << " ";
//輸出:1 2 3 4 5
在 C11 新標準中,還可使用如下方式遍歷 set 中的元素
set<int> set_1 = { 1, 2, 3, 4, 5 };
for(auto n:set_1)
cout << n << " ";
//輸出:1 2 3 4 5
注:這種方式寫法簡介,但只能使用遍歷 set 對象中所有元素,但使用迭代器時可以指定 set 對象中的一部分元素進行訪問。