重点:
头文件#include<set>
1、set中的元素都是排好序的
2、set集合中没有重复的元素
c++ stl集合(Set)是一种包含已排序对象的关联容器。set/multiset会根据待定的排序准则,自动将元素排序。两者不同在于前者不允许元素重复,而后者允许。
注意:
不能直接改变元素值,因为那样会打乱原本正确的顺序,要改变元素值必须先删除旧元素,再插入新元素
不提供直接存取元素的任何操作函数,只能通过迭代器进行间接存取,而且从迭代器角度来看,元素值是常数
元素比较动作只能用于型别相同的容器(即元素和排序准则必须相同)
1.定义set:
set<int>name;
set<double>name;
set<char>name;
set<node>name;//node是结构体类型
set<int>a[100];//数组类型
自定义比较函数
(1)元素不是结构体:
自定义比较函数myComp,重载“()”操作符
struct myComp
{
bool operator()(const your_type &a, const your_type &b){
return a.data - b.data > 0;
}
}
set<int, myComp>s;
set<int, myComp>::iterator it; erator it;
(2)如果元素是结构体,可以直接将比较函数写在结构体内。
struct Info
{
string name;
float score;
//重载“<”操作符,自定义排序规则
bool operator < (const Info &a) const{
//按score从大到小排列
return a.score<score;
}
}
set<Info> s;
set::iterator it;
2.set容器内元素的访问
与vector不同,set只能通过迭代器(iterator)访问,并用*it来访问其中的元素例如:
set<int>::iterator it;
set<char>::iterator it;
由于除开vector和string之外的STL容器都不支持*(it +i)的访问方式,因此只能按如下方式枚举
set<int>st;
for(set<int>::iterator it = st.begin();it != st.end();it++)
printf("%d",*it);
3.set常用函数实例解析
begin()
返回set容器的第一个迭代器
end()
返回set容器的最后一个迭代器
rbegin()
返回的值和end()相同
rend()
返回的值和rbegin()相同
insert()
insert(x)可将x插入set容器中,并自动递增排序和去重
返回值是pair<set<int>::iterator,bool>,bool标志着插入是否成功,而iterator代表插入的位置,若key_value已经在set中,则iterator表示的key_value在set中的位置。
inset(first,second);将定位器first到second之间的元素插入到set中,返回值是void.
int a[] = {1,2,3};
set<int> s;
set<int>::iterator iter;
s.insert(a,a+3);
find()
find(value)返回set对应值为value的迭代器,没找到返回end();
count()
用来查找set中某个某个键值出现的次数。这个函数在set并不是很实用,
因为一个键值在set只可能出现0或1次,这样就变成了判断某一键值是否在set出现过了。
equal_range()
返回一对定位器,分别表示第一个大于或等于给定关键值的元素和 第一个大于给定关键值的元素,
这个返回值是一个pair类型,如果这一对定位器中哪个返回失败,就会等于end()的值。
lower_bound(key_value)
返回第一个大于等于key_value的定位器
upper_bound(key_value)
返回第一个一个大于key_value的定位器
erase()
一种删除方法是erase(it),里面为迭代器,另一种是erase(value),里面放的是值。还可以删除区间内的元素,如st.erase(first,second);
//第一种删除
s.erase(s.begin());
//第二种删除
first = s.begin();
second = s.begin();
second++;
second++;
s.erase(first,second);
//第三种删除
s.erase(8);
size()
用于获取set内元素的个数
max_size()
返回set容器可能包含的元素最大个数
clear()
清空set中的元素
empty()
判断set容器是否为空
成员函数 | 作用 |
---|---|
begin() | 返回指向第一个元素的迭代器 |
clear() | 清除所有元素 |
count() | 返回某个值元素的个数 |
empty() | 如果集合为空,返回true |
end() | 返回指向最后一个元素下一个位置的迭代器 |
equal_range() | 返回集合中与给定值相等的上下限的两个迭代器 |
erase() | 删除集合中的元素 |
find() | 返回一个指向被查找到元素的迭代器 |
get_allocator() | 返回集合的分配器 |
insert() | 在集合中插入元素 |
lower_bound() | 返回指向大于(或等于)某值的第一个元素的迭代器 |
upper_bound() | 返回大于某个值元素的迭代器 |
key_comp() | 返回一个用于元素间值比较的函数 |
max_size() | 返回集合能容纳的元素的最大限值 |
rbegin() | 返回指向集合中最后一个元素的反向迭代器 |
rend() | 返回指向集合中第一个元素的反向迭代器 |
size() | 集合中元素的数目 |
swap() | 交换两个集合变量 |
value_comp() | 返回一个用于比较元素间的值的函数 |