作为一个容器也是用来存储同一数据类型的数据类型,并且能从一个数据集合中取出数据,在  中每个元素的值都唯一,而且系统能根据元素的值自动进行排序。应该注意的是  中数元素的值不能直接被改变。与  的使用方法大致都相同。

set的定义

set<类型> 对象名; 如:set<int> s;

添加元素

set<int> s;
s.insert(8);
s.insert(10);
s.insert(6);
s.insert(8); //重复元素不会插入

set遍历

 set 的遍历也是使用迭代器进行遍历, 可以正序遍历也可以反序遍历。

正序遍历

set<int> s;
set<int>::iterator it;
for (it = s.begin(); it != s.end(); it++)
    cout << *it << endl;

反序遍历

set<int>::reverse_iterator it;
for (it = s.rbegin(); it != s.rend(); it++)
    cout << *it << endl

常用操作

begin(),               //返回set容器的第一个元素
end(),                 //返回set容器的最后一个元素
clear(),               //删除set容器中的所有的元素
empty(),               //判断set容器是否为空
max_size(),            //返回set容器可能包含的元素最大个数
size(),                //返回当前set容器中的元素个数
rbegin(),              //返回的值和end()相同
rend(),                //返回的值和begin()相同
erase(iterator),       //删除定位器iterator指向的值
erase(first,second),   //删除定位器first和second之间的值
erase(key_value),      //删除键值key_value的值
find() ,              //返回给定值值得定位器,如果没找到则返回end()。

set中还有两个非常重要的函数,lower_bound()和upper_bound()。这两个函数都需要传入一个值。
lower_bound返回的是大于或等于被查询元素的第一个元素位置的迭代器,如果找不到,迭代器则为set.end() 。
upper_bound返回值则是>给定val的最小指针(iterator)。
rbegin() 和 rend()为反向迭代器。

因为 set中的元素本身是有序的,因此 begin() 会直接返回集合中最小的元素的位置,而 end()-- 返回的是集合中最大元素的位置。

同排序函数相同,我们可以自行定义比较的方法,但具体使用同  sort 略有不同,需要自己定义一个 struct 来做具体类型的比较,同时要定义一个名为 operator 的 bool 类型函数,具体请看下面的代码。

#include <bits/stdc++.h>
using namespace std;
//自定义比较结构体

struct Cmp {
	bool operator()(int l, int r)  { 
        return l % 10 > r % 10;
    }
};

int main() {
	set<int, Cmp> s;
    for(int i = 7; i < 27; i++)
        s.insert(i);

    set<int>::iterator it;
    for (it = s.begin(); it != s.end(); it++)
        cout << *it << endl;
	return 0;
}

更多推荐