C++ STL 之 set

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 對象中的一部分元素進行訪問。

 

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