zoukankan      html  css  js  c++  java
  • 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);

  • 相关阅读:
    华为牛人在华为工作十年的感悟!(有点长)(转载)
    C# 10进制与16进制相互转换
    Linux必学的60个命令
    项目管理
    网络数据加密需要解决三个问题:
    DES加密/解密的应用
    一个比较牛的加密算法
    开发完成后总结心得(团队会议稿) (转载)
    相当于序列化与反序列化,但是不用借助外部文件
    软件开发设计常识
  • 原文地址:https://www.cnblogs.com/maycpou/p/14337441.html
Copyright © 2011-2022 走看看