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 对象中的一部分元素进行访问。

 

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