stl(13)set容器和multiset容器

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);

posted @ 2021-01-27 22:41  maycpou  阅读(91)  评论(0编辑  收藏  举报