1.set容器的底层结构是红黑树。对set中元素的操作就是对这棵树上的结点进行操作。
2.由于红黑树是一个有序的结构,所以set的迭代器不允许修改元素的值,因为如果修改了元素的值那么为了保证set的有序结构,就还需要重新再次排序,所以set的迭代器不允许修改元素的值,换句话说就是const的。
3.set容器中的值不允许相同,multiset容器中的值允许相同,其他两者一致。set和multiset的头文件都是#include <set>
4.可以使用empty来判断set容器是否为空,size来返回set容器中元素的数量。
5.set容器不能使用push_back或者push_front来进行插入操作,它的插入操作使用insert
std::set<int> set;
set.insert(10);
set.insert(50);
set.insert(30);
for(std::set<int>::iterator it=set.begin();it!=set.end();it++){
std::cout<<*it<<std::endl;
}
这里的打印输出结果是:10 30 50。由于set是一个有序的结构,在插入数据的时候它内部自己就进行了排序,所以元素在set容器中的位置和元素的插入顺序没有关系。
insert方法的返回值是一个pair<iterator,bool>类型,这个pair中第一个是一个迭代器如果插入成功则指向插入的元素,如果插入不成功则指向set.end()。第二个bool类型表示是否插入成功。
std::set<int> set;
set.insert(10);
set.insert(50);
set.insert(30);
std::pair<std::set<int>::iterator,bool> pair = set.insert(30);//由于set中不允许出现重复值所以这次插入失败
if(pair.second==false){
std::cout<<"插入失败"<<std::endl;
}
6.swap,clear的用法与vector容器一样。
7.erase的用法除了vector中erase的用法外,它还可以删除和传入元素相等的元素。
std::set<int> set;
set.insert(10);
set.insert(50);
set.insert(30);
set.erase(10);
8.set容器的查找操作
(1)find,查找某个元素是否存在,如果存在则返回该元素在容器中的迭代器,如果不存在则返回set.end()迭代器。
std::set<int> set;
set.insert(10);
set.insert(50);
set.insert(30);
std::set<int>::iterator it = set.find(30);
if(it==set.end()){
std::cout<<"指定元素在容器中不存在"<<std::endl;
}
(2)count,统计指定元素在容器中存在的个数,由于set容器中不允许有重复的元素,所以返回值不会大于1,而对于multiset则可能大于1
std::set<int> set;
set.insert(10);
set.insert(50);
set.insert(30);
int count = set.count(50);
(3)lower_bound,返回在容器中第一个大于等于传入元素的迭代器,也就是说在该迭代器之前的元素都小于传入元素,后面的都大于传入的元素。如果没有这样的元素则返回set.end()
std::set<int> set;
set.insert(10);
set.insert(50);
set.insert(30);
std::set<int>::iterator it = set.lower_bound(20);
std::cout<<*it<<std::endl;
(4)upper_bound,返回在容器中第一个大于传入元素的迭代器,也就是说在该迭代器之前的元素都小于传入元素,后面的都大于传入的元素。如果没有这样的元素则返回set.end()
(5)equal_range,这个方法会同时返回lower_bound和upper_bound返回的迭代器,也就是说它会返回两个迭代器。
std::set<int> set;
set.insert(10);
set.insert(50);
set.insert(30);
pair<std::set<int>::iterator,std::set<int>::iterator> it = set.equal_range(30);
lstd::set<int>::iterator lowerIt = it .first();
lstd::set<int>::iterator upperIt = it .second();
9.set容器的排序规则默认是从小到大,我们也可以自己指定排序规则,并且如果set容器存放的数据类型是我们自己定义的数据类型则必须在初始化set容器的时候指定排序规则:
class MyCompare{
public:
bool operator()(int v1,intv2){//重载操作符"()"
return v1>v2;
}
}
std::set<int,MyCompare> set;//这样set容器的排序规则就变为从大到小了
set.insert(10);
set.insert(50);
set.insert(30);