c++中的set容器和multiset容器

set容器基本概念

  1. set的特性是,所有元素都会根据元素的键值自动被排序。set的元素不像map那样可以同时拥有实值和键值,set的元素即是键值又是实值。set不允许两个元素又相同的键值。
  2. 我们不可以通过set的迭代器改变set元素的值,因为set元素值就是其键值,关系到set元素的排序规则。如果任意改变set元素值,会严重破坏set组织。换句话说,set的iterato是一种const_iterator
  3. set拥有和list某些相同的性质,当对容器中的元素进行插入操作或者是拿出操作或者删除操作的时候,操作之前所有的迭代器,在操作完成之后依然有效,被删除的那个元素的迭代器是一个例外

multiset容器的基本概念

multiset特性及用法和set完全相同,唯一的差别在于它允许键值重复,set和multiset的底层实现是红黑树,红黑树为平衡二叉树的一种

红黑树:一个结点的左边全部小于它,它的右边全部大于它

set/multiset 对象的默认构造

  1. setsetInt; //一个存放 int 的 set 容器。
  2. setsetFloat; //一个存放 float 的 set 容器。
  3. setsetString; //一个存放 string 的 set 容器。
  4. multisetmulsetInt; //一个存放 int 的 multiset 容器。
  5. multisetmultisetFloat; //一个存放 float 的 multiset 容器。
  6. multisetmultisetString; //一个存放 string 的 multiset 容器。

set 的插入与迭代器

  1. set.insert(elem); //在容器中插入元素。

  2. set.begin(); //返回容器中第一个数据的迭代器。

  3. set.end(); //返回容器中最后一个数据之后的迭代器。

  4. set.rbegin(); //返回容器中倒数第一个元素的迭代器。

  5. set.rend(); //返回容器中倒数最后一个元素的后面的迭代器。

    //set容器不允许插入重复的键值
    void test03()
    {set<int>s1;pair<set<int>::iterator,bool>ret=s1.insert(10);if (ret.second == true){cout << "插入成功" << endl;}else{cout << "插入失败" << endl;}ret=s1.insert(10);if (ret.second == true){cout << "第二次插入成功" << endl;}else{cout << "第二次插入失败" << endl;}printSet(s1);
    }
    

Set 集合的元素排序

  1. set<int,less> setIntA; //该容器是按升序方式排列元素。

  2. set<int,greater>setIntB; //该容器是按降序方式排列元素。

  3. set 相当于 set<int,less>。

  4. less与 greater中的 int 可以改成其它类型,该类型主要要跟 set 容纳的数据 类型一致。

    //指定set排序规则从大到小
    //仿函数 
    //函数不能做类型,class可以做类型
    class myCompare
    {
    public://重载()bool operator()(int v1, int v2){return v1 > v2;}
    };//set容器排序
    void test04()
    {//set<int>s1;set<int, myCompare>s1;s1.insert(5);s1.insert(1);s1.insert(9);s1.insert(3);s1.insert(7);//从大到小排序//在插入之前就指定排序规则for (set<int, myCompare>::iterator it = s1.begin(); it != s1.end(); it++){cout << *it << " ";}cout << endl;}
    

set 对象的拷贝构造与赋值

  1. set(constset&st); //拷贝构造函数

  2. set&operator=(constset&st); //重载等号操作符 set.swap(st); //交换两个集合容器

set 的大小操作

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

set 的删除操作

  1. set.clear(); //清除所有元素
  2. set.erase(pos); //删除 pos 迭代器所指的元素,返回下一个元素的迭代器。
  3. set.erase(beg,end); //删除区间[beg,end)的所有元素 ,返回下一个元素的迭代器。
  4. set.erase(elem); //删除容器中值为 elem 的元素。

set 的查找操作

  1. set.find(elem); //查找 elem 元素,返回指向 elem 元素的迭代器。

  2. set.count(elem); //返回容器中值为 elem 的元素个数。对 set 来说,要么是 0,要 么是 1。对 multiset 来说,值可能大于 1。

  3. set.lower_bound(elem); //返回第一个>=elem 元素的迭代器

  4. set.upper_bound(elem); // 返回第一个>elem 元素的迭代器。

  5. set.equal_range(elem); //返回容器中与 elem 相等的上下限的两个迭代器。上 限是闭区间,下限是开区间,如[beg,end)。

     void test02(){set<int>s1;s1.insert(5);s1.insert(1);s1.insert(9);s1.insert(3);s1.insert(7);//对于set 没有value key就是valueset<int>::iterator pos=s1.find(2);//判断是否找到if (pos != s1.end()){cout << "找到了,值为:" << *pos << endl;}else{cout << "未找到" << endl;}//count(key)//查找键值key的元素的个数  set而言结果是0或者1int num = s1.count(2);cout << "2的个数为:" << num << endl;//lower_bound(keyElem);//返回第一个key=keyElem元素的迭代器set<int>::iterator it=s1.lower_bound(10);if (it != s1.end()){cout << "找到了,值为" << *it << endl;}else{cout << "未找到" << endl;}//upper_bound(keyElem);//返回第一个key>keyElem元素的迭代器,set<int>::iterator it2 = s1.upper_bound(3);//第一个大于3的值if (it2 != s1.end()){cout << "找到了,值为" << *it2 << endl;//5}else{cout << "未找到" << endl;}//equal_range(keyElem);//返回容器中key与keyElem相等的上下限的两个迭代器//上下限 就是lower_bound和upper_boundpair <set<int>::iterator, set<int> ::iterator> ret = s1.equal_range(3);//获取第一个值if (ret.first != s1.end()){cout << "找到equal_range中的lower_bound的值:" << *(ret.first) << endl;}else{cout << "未找到" << endl;}//获取第二个值if (ret.second != s1.end()){cout << "找到equal_range中的equal_range的值:" << *(ret.second) << endl;}else{cout << "未找到" << endl;}}
    

注意:
1 关联式容器
2 插入数据自动排序
3 insert插入值
4 erase参数可以传值或者迭代器

    #include<iostream>using namespace std;#include<set>void printSet(set<int>&s){for (set<int>::iterator it = s.begin(); it != s.end(); it++){cout << *it << " ";}cout << endl;}void test01(){set<int>s1;//关联式容器 key进行排序,从小到大自动排序s1.insert(5);s1.insert(1);s1.insert(9);s1.insert(3);s1.insert(7);printSet(s1);if (s1.empty()){cout << "空" << endl;}else{cout << "size=" << s1.size() << endl;}s1.erase(s1.begin());//3 5 7 9printSet(s1);s1.erase(3);// 5 7 9printSet(s1);}int main(){test01();system("pause");return 0;}

pair 的使用

  1. pair 译为对组,可以将两个值视为一个单元。

  2. pair<T1,T2>存放的两个值的类型,可以不一样,如 T1 为 int,T2 为 float。T1,T2 也可 以是自定义类型。

  3. pair.first 是 pair 里面的第一个值,是 T1 类型。

  4. pair.second 是 pair 里面的第二个值,是 T2 类型。

    #include<iostream>using namespace std;
    #include<string>void test01()
    {//第一种pair<string, int>p(string("Tom"), 100);//取值cout << "姓名:" << p.first << endl;cout << "年龄:" << p.second << endl;//第二种创建方式pair<string, int>p2 = make_pair("Jerry", 200);cout << "姓名:" << p.first << endl;cout << "年龄:" << p.second << endl;
    }int main()
    {test01();system("pause");return 0;
    }
    

set容器中插入自定义数据类型

 //自定义数据类型class Person{public:Person(string name, int age){this->m_Name = name;this->m_Age = age;}string m_Name;int m_Age;};class myComparePerson{public:bool operator()(const Person&p1, const Person&p2){if (p1.m_Age > p2.m_Age)//降序{return true;}return false;}};void test05(){set<Person,myComparePerson>s1;Person p1("大娃", 100);Person p2("二娃", 90);Person p3("六娃", 10);Person p4("爷爷", 1000);s1.insert(p1);s1.insert(p2);s1.insert(p3);s1.insert(p4);//插入自定义数据类型,一开始必须指定排序规则//显示for (set<Person, myComparePerson>::iterator it = s1.begin(); it != s1.end(); it++){cout << "姓名:" << (*it).m_Name << "年龄" << (*it).m_Age << endl;}}int main(){//test01();//test02();//test03();//test04();test05();system("pause");return 0;}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/383268.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

linux下的僵尸进程处理SIGCHLD信号

什么是僵尸进程&#xff1f; 首先内核会释放终止进程(调用了exit系统调用)所使用的所有存储区&#xff0c;关闭所有打开的文件等&#xff0c;但内核为每一个终止子进程保存了一定量的信息。这些信息至少包括进程ID&#xff0c;进程的终止状态&#xff0c;以及该进程使用的CPU时…

c++中的map容器

map/multimap基本概念 Map的特性是&#xff0c;所有元素都会根据元素的键值自动排序。Map所有的元素都是pair&#xff0c;同时拥有实值和键值&#xff0c;pair的第一元素被视为键值&#xff0c;第二元素被视为实值&#xff0c;map不允许两个元素有相同的键值我们可以通过map的…

mknod指令详解

mknod - make block or character special files mknod [OPTION]... NAME TYPE [MAJOR MINOR] option 有用的就是 -m 了 name 自定义 type 有 b 和 c 还有 p 主设备号 次设备号 主设备号是由linux/major.h定义的&#xff0c;如下定义了一个DOC设备&am…

c++中容器(STL)的共性与使用的时机

容器的共通能力 C模板是容器的概念 理论提高&#xff1a;所有容器提供的都是值&#xff08;value&#xff09;语意&#xff0c;而非引用&#xff08;reference&#xff09;语意。容器执 行插入元素的操作时&#xff0c;内部实施拷贝动作。所以 STL 容器内存储的元素必须能够被…

Qt Creator 窗体控件自适应窗口大小布局

常见的软件窗口大小改变&#xff08;最大化、手动改变时&#xff09;需要窗口的部件能够自适应布局&#xff0c;而在Qt的应用程序界面设计中&#xff0c;对于像我一样的初学者如何实现窗口自适应调整还是要绕点弯路的。网上百度了很多&#xff0c;多数说的很含糊&#xff0c;还…

c++中利用STL实现公司员工分组问题

#include<iostream>using namespace std; #include<vector> #include<string> #include<map> #include<ctime> /* 公司招聘了5个员工&#xff0c;5名员工进入公司之后&#xff0c;需要指派员工在那个部门工作 的人员信息&#xff1a;姓名 年龄 电…

c++中STL的常用算法--1(函数对象,谓词,内建函数对象)

函数对象 重载函数调用操作符的类&#xff0c;其对象常称为函数对象&#xff08;function object&#xff09;&#xff0c;即它们是行为类似函数的对象&#xff0c;也叫仿函数&#xff08;functor&#xff09;&#xff0c;其实就是重载"()"操作符&#xff0c;使得类…

QT子线程与主线程的信号槽通信

最近用QT做一个服务器&#xff0c;众所周知&#xff0c;QT的主线程必须保持畅通&#xff0c;才能刷新UI。所以&#xff0c;网络通信端采用新开线程的方式。在涉及到使用子线程更新Ui上的控件时遇到了点儿麻烦。网上提供了很多同一线程不同类间采用信号槽通信的方式&#xff0c;…

ubuntu14.04 通过PPA 安装ffmpeg

去ffmpeg的官网可以获取到最新的PPA信息 http://www.ffmpeg.org/download.html 根据系统选择对应的PPA 然后执行以下语句&#xff1a; sudo add-apt-repository ppa:mc3man/trusty-media sudo apt-get updatesudo apt-get install ffmpeg 如果在安装过程中发生了错误&#…

c++中的函数适配器

函数适配器 函数适配器概念 STL中定义了大量的函数对象&#xff0c;但是有时候需要对函数返回值进行进一步的简单计算&#xff0c;或者填上多余的参数&#xff0c;不能直接代入算法&#xff0c;函数适配器实现了这一功能&#xff0c;将一种函数对象转化为另一种符合要求的函数…

c++中STL的常用算法---2(遍历算法,查找算法)

算法概述 算法主要由头文件组成是所有STL头文件中最大的一个&#xff0c;其中常用的功能涉及到比较&#xff0c;交换&#xff0c;查找&#xff0c;遍历&#xff0c;复制&#xff0c;修改&#xff0c;反转&#xff0c;排序&#xff0c;合并等体积很小&#xff0c;只包括在几个序…

c++中的STL的常用算法---3(排序算法,拷贝和替换算法,算术生成算法,集合算法)

排序算法 merge() 以下是排序和通用算法&#xff1a;提供元素排序策略 merge: 合并两个有序序列&#xff0c;存放到另一个序列。 #include<iostream>using namespace std; #include<algorithm> #include<vector>void test01() {vector<int >v1;vecto…

c++中STL实现演讲比赛流程

演讲比赛流程 1&#xff09;某市举行一场演讲比赛&#xff0c;共有 24 个人参加&#xff0c;按参加顺序设置参赛号。比赛共三轮&#xff0c;前两 轮为淘汰赛&#xff0c;第三轮为决赛。 2&#xff09;比赛方式&#xff1a;分组比赛 第一轮分为 4 个小组&#xff0c;根据参赛号…

c++实现贪吃蛇

游戏中的实现元素 游戏中元素分为&#xff1a;墙壁&#xff0c;蛇&#xff0c;事物以及蛇的可行区域和右侧的版本号和游戏玩法提示 墙壁 *号表示&#xff0c;代表一个区域范围&#xff0c;也就是蛇的可移动区域&#xff0c;蛇如果碰到墙壁视为死亡&#xff0c; 蛇 分为蛇头&a…

Linux系统编程--1(进程和程序,CPU和MMU,PCB,进程状态)

进程相关概念 程序和进程 程序&#xff1a;是指编译好的二进制文件&#xff0c;在磁盘上&#xff0c;不占用系统资源(cpu、内存、打开的文件、设备、锁…) 进程&#xff1a;是一个抽象的概念&#xff0c;与操作系统原理联系紧密。进程是活跃的程序&#xff08;程序员角度&…

C++STL学习

1. STL介绍标准模板库STL是当今每个从事C编程的人需要掌握的技术&#xff0c;所有很有必要总结下本文将介绍STL并探讨它的三个主要概念&#xff1a;容器、迭代器、算法。STL的最大特点就是&#xff1a;数据结构和算法的分离&#xff0c;非面向对象本质。访问对象是通过象指针一…

Linux系统编程--2(环境变量,进程控制)

环境变量 环境变量 是指在操作系统中用来指定操作系统运行环境的一些参数 每个人用电脑的习惯不一样&#xff0c;比如一般把文件放到磁盘&#xff0c;怎么管理文件&#xff0c;用什么编译器&#xff0c;所以&#xff0c;环境变量就是根据每个人使用操作系统的习惯来规定一些参…

STL-vector

STL学习之二 序列容器&#xff08;vector&#xff09;一、C标准模板库提供了三种序列容器&#xff1a;vector、list、deque。类模板vector和deque都以数组为基础&#xff0c;类模板list实现了链表的数据结构。STL中最流行的是类模板vector&#xff0c;它是一种更健壮的数据类型…

套接字编程--1(UDP协议编程,端口号,传输层协议,网络字节序)

传输层的协议&#xff1a; ip地址&#xff1a; 在网络中唯一标识一台主机 IPV4&#xff1a;uint32_t DHCP NATIPV6 : uint8_t addr[16] —向前并不兼容IPV4 每一条数据都必须包含源地址和目的地址&#xff1a;因为每条网络中的数据都必须确定是从那个主机来到那个主机去 端…