C++回顾(二十四)—— set / multiset容器
创始人
2024-06-01 16:14:50
0

24.1 set概述

  • set是一个集合容器,其中所包含的元素是唯一的集合中的元素按一定的顺序排列。元素插入过程是按排序规则插入,所以不能指定插入位置。
  • set采用红黑树变体的数据结构实现,红黑树属于平衡二叉树。在插入操作和删除操作上比vector快。
  • set不可以直接存取元素。(不可以使用at.(pos)与[]操作符)。
  • multiset与set的区别:set支持唯一键值,每个元素值只能出现一次;而multiset中同一值可以出现多次
  • 不可以直接修改set或multiset容器中的元素值,因为该类容器是自动排序的。如果希望修改一个元素值,必须先删除原有的元素,再插入新的元素。
  • 需要添加头文件:#include

24.2 set的构造

  • set setInt; //一个存放int的set容器。
  • set setFloat; //一个存放float的set容器。
  • set setString; //一个存放string的set容器。
  • multiset mulsetInt; //一个存放int的multi set容器。
  • multi set multisetFloat; //一个存放float的multi set容器。
  • multi set multisetString; //一个存放string的multi set容器。
    在这里插入图片描述

24.3 set的使用

(1)set的插入与迭代器

  • set.insert(elem); //在容器中插入元素。
  • set.begin(); //返回容器中第一个数据的迭代器。
  • set.end(); //返回容器中最后一个数据之后的迭代器。
  • set.rbegin(); //返回容器中倒数第一个元素的迭代器。
  • set.rend(); //返回容器中倒数最后一个元素的后面的迭代器。
    在这里插入图片描述

(2)set集合的元素排序

  • set > setIntA; //该容器是按升序方式排列元素。
  • set> setIntB; //该容器是按降序方式排列元素。
  • set 相当于 set
  • less与greater中的int可以改成其它类型,该类型主要要跟set容纳的数据类型一致。

(3)set对象的拷贝构造与赋值

  • set(const set &st); //拷贝构造函数
  • set& operator=(const set &st); //重载等号操作符
  • set.swap(st); //交换两个集合容器

(4)set的大小

  • set.size(); //返回容器中元素的数目
  • set.empty();//判断容器是否为空

(5)set的删除

  • set.clear(); //清除所有元素
  • set.erase(pos); //删除pos迭代器所指的元素,返回下一个元素的迭代器。
  • set.erase(beg,end); //删除区间[beg,end)的所有元素 ,返回下一个元素的迭代器。
  • set.erase(elem); //删除容器中值为elem的元素。
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述

(6)set的查找

  • set.find(elem); //查找elem元素,返回指向elem元素的迭代器。
  • set.count(elem); //返回容器中值为elem的元素个数。对set来说,要么是0,要么是1。对multiset来说,值可能大于1。
  • set.lower_bound(elem); //返回第一个>=elem元素的迭代器。
  • set.upper_bound(elem); // 返回第一个>elem元素的迭代器。
  • set.equal_range(elem); //返回容器中与elem相等的上下限的两个迭代器。上限是闭区间,下限是开区间,如[beg,end)。以上函数返回两个迭代器,而这两个迭代器被封装在pair中。以下讲解pair的含义与使用方法。
    在这里插入图片描述

(7)pair的使用

  • pair译为对组,可以将两个值视为一个单元。
  • pair存放的两个值的类型,可以不一样,如T1为int,T2为float。T1,T2也可以是自定义类型。
  • pair.first是pair里面的第一个值,是T1类型。
  • pair.second是pair里面的第二个值,是T2类型。

在这里插入图片描述
完整示例代码:

#include 
#include using namespace std;class Student
{
private:	int id;string name;
public:Student(int i, string n);void show()const;bool operator<(const Student &s) const;bool operator>(const Student &s) const;
};Student::Student(int i, string n)
{id = i;name = n;
}void Student::show() const
{cout << "id " << id << "    name " << name << endl; 
}bool Student::operator<(const Student &s) const
{return this->id < s.id;
}bool Student::operator>(const Student &s) const
{return this->id > s.id;
}int main()
{Student s1(3, "aa");Student s2(1, "zz");Student s3(5, "ff");Student s4(4, "ee");Student s5(2, "bb");Student s6(7, "cc");Student s7(8, "hh");Student s8(6, "jj");//set s;  // 默认 < set > s;s.insert(s1);s.insert(s2);s.insert(s3);s.insert(s4);s.insert(s5);s.insert(s6);s.insert(s7);s.insert(s8);for (set::iterator it = s.begin(); it != s.end(); it++){it->show();}cout << "集合大小:" << s.size() << endl;cout << "set的删除" << endl;s.erase(s.begin());for (set::iterator it = s.begin(); it != s.end(); it++){it->show();}cout << "set区间删除" << endl;s.erase(--(s.end()), s.end()); // 这里相当于删除最后一个元素for (set::iterator it = s.begin(); it != s.end(); it++){it->show();}cout << "set删除具体元素" << endl;Student stu(3, "zz");    //按照id查找并删除(因为排序的时候是按照id进行排序的)s.erase(stu);for (set::iterator it = s.begin(); it != s.end(); it++){it->show();}cout << "set的查找" << endl;//set >::iterator it = s.find(stu); // 会找不到,因为前面被删除了set >::iterator it = s.find(s6);if (it == s.end()){cout << "对象不存在" << endl;}else{it->show();}cout << "set的统计" << endl;cout << s.count(s6) << endl; // set不允许有重复,只能是0 或则 1cout << "lower_bound" << endl;Student ss(3, "aaa");it = s.lower_bound(ss);if (it == s.end()){cout << "不存在" << endl;}else{it->show();}cout << "upper_bound" << endl;it = s.upper_bound(s6);if (it == s.end()){cout << "不存在" << endl;}else{it->show();}cout << "equal_range" << endl;//pair 类型 模板类 有两个成员变量pair >::iterator, set >::iterator> p;    //创建pair对象p = s.equal_range(ss); p.first->show();      //p.first第一个类型(迭代器)p.second->show();     //p.second第二个类型(迭代器)return 0;
}

运行结果:
在这里插入图片描述

相关内容

热门资讯

监控摄像头接入GB28181平... 流程简介将监控摄像头的视频在网站和APP中直播,要解决的几个问题是:1&...
Windows10添加群晖磁盘... 在使用群晖NAS时,我们需要通过本地映射的方式把NAS映射成本地的一块磁盘使用。 通过...
protocol buffer... 目录 目录 什么是protocol buffer 1.protobuf 1.1安装  1.2使用...
在Word、WPS中插入AxM... 引言 我最近需要写一些文章,在排版时发现AxMath插入的公式竟然会导致行间距异常&#...
【PdgCntEditor】解... 一、问题背景 大部分的图书对应的PDF,目录中的页码并非PDF中直接索引的页码...
修复 爱普生 EPSON L4... L4151 L4153 L4156 L4158 L4163 L4165 L4166 L4168 L4...
Fluent中创建监测点 1 概述某些仿真问题,需要创建监测点,用于获取空间定点的数据࿰...
educoder数据结构与算法...                                                   ...
MySQL下载和安装(Wind... 前言:刚换了一台电脑,里面所有东西都需要重新配置,习惯了所...
MFC文件操作  MFC提供了一个文件操作的基类CFile,这个类提供了一个没有缓存的二进制格式的磁盘...