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