C++ set/multiset容器 学习总结
-------------------------------------set/multiset容器
set/multiset特性
set/multiset的特性是所有元素会根据元素的值自动进行排序。set是以RB-tree(红黑树,平衡二叉树的一种)为底层机制
其查找效率非常好。set容器中不允许重复元素,multiset允许重复元素
二叉树就是人和街店最多只允许有两个子节点。分别是左子节点和右子节点
二叉搜索树,是指二叉树中节点按照一定规则进行排序,使得对二叉树中元素访问更加高效
二叉搜索树的放置规则是:任何节点的元素值一定大于其左子树中的每一个节点的元素值,并且小于其右子树的值
set是根据元素值进行排序,关系到set的排序规则,如果任意改变set的元素值,会严重破坏set的组织
---------------------set的常用API
set构造函数
set<T> st; set默认构造函数
multiset<T> mst; multiset默认构造函数
set(const set& st); 拷贝构造函数
set赋值操作
set& operator= (const set& st); 重载=操作符
swap(st); 交换两集合容器
set大小操作
size(); 返回容器中元素数目
empty(); 判断容器是否为空
set插入和删除操作
insert(elem); 在容器中插入元素
clear(); 清除所有元素
erase(pos); 删除pos迭代器所指向的元素,返回下一个元素的迭代器
erase(beg,end); 删除区间[beg,end)的所有元素,返回下一个元素的迭代器
erase(elem); 删除容器中值为elem的元素
set查找操作
find(key); 查找key是否存在,若存在,返回该元素的迭代器;若不存在,返回map.end()
lower_bound(keyElem); 返回第一个key>=keyElem元素的迭代器
upper_bound(keyElem); 返回第一个key>keyElem元素的迭代器
equal_range(keyElem); 返回容器中key=keyElem的上下限的两个迭代器
#include<iostream>
#include<set>
#include<algorithm>
using namespace std;
//仿函数
class cmp {
public:
bool operator() (int v1,int v2) {
return v1 > v2;
}
};
//set容器初始化
void test01 () {
set<int,cmp> s1;
s1.insert(7);
s1.insert(2);
s1.insert(4);
s1.insert(5);
s1.insert(1);
//默认 小->大
for (set<int>::iterator it = s1.begin();it != s1.end();it ++) {
cout << *it << " ";
}
cout << endl;
//赋值操作
set<int> s2;
s2 = s1;
//删除操作
s1.erase(s1.begin());
s1.erase(7);
for (set<int>::iterator it = s1.begin();it != s1.end();it ++) {
cout << *it << " ";
}
cout << endl;
//先序遍历 中序遍历 后序遍历
//如何改变默认排序
}
//set查找
void test02 () {
//实值
set<int> s1;
s1.insert(7);
s1.insert(2);
s1.insert(4);
s1.insert(5);
s1.insert(1);
set<int>::iterator ret = s1.find(4);
if (ret == s1.end()) {
cout << "没找到" << endl;
}
else {
cout << "ret: " << *ret << endl;
}
}
//找到第一个大于等于key的元素
void test03 () {
set<int> s1;
s1.insert(7);
s1.insert(2);
s1.insert(4);
s1.insert(5);
s1.insert(1);
set<int>::iterator ret = s1.lower_bound(2);
if (ret == s1.end()) {
cout << "没找到" << endl;
}
else {
cout << "ret: " << *ret << endl;
}
}
//找到第一个大于key的元素
void test04 () {
set<int> s1;
s1.insert(7);
s1.insert(2);
s1.insert(4);
s1.insert(5);
s1.insert(1);
set<int>::iterator ret = s1.upper_bound(2);
if (ret == s1.end()) {
cout << "没找到" << endl;
}
else {
cout << "ret: " << *ret << endl;
}
}
//返回lower_bound和upper_bound的值
void test05 () {
set<int> s1;
s1.insert(7);
s1.insert(2);
s1.insert(4);
s1.insert(5);
s1.insert(1);
pair<set<int>::iterator,set<int>::iterator> ret = s1.equal_range(2);
if (ret.first == s1.end()) {
cout << "没找到" << endl;
}
else {
cout << "找到!";
cout << "ret.first: " << *ret.first << endl;
}
if (ret.second == s1.end()) {
cout << "没找到" << endl;
}
else {
cout << "找到!";
cout << "ret.scond: " << *ret.second << endl;
}
}
class Person {
public:
Person(int age,int id):age(age),id(id) {}
public:
int age;
int id;
};
class cmp2 {
public:
bool operator() (const Person& p1,const Person& p2) {
return p1.age > p2.age;
}
};
void test06 () {
set<Person,cmp2> sp; //set需要排序,当放入对象时,set不知道怎么排序
Person p1(10,20),p2(30,40),p3(50,60);
sp.insert(p1);
sp.insert(p2);
sp.insert(p3);
Person p4(60,30);
for (set<Person,cmp2>::iterator it = sp.begin();it != sp.end();it ++) {
cout << (*it).age << " " << (*it).id << endl;
}
//查找
set<Person,cmp2>::iterator ret = sp.find(p4);
if (ret == sp.end()) {
cout << "没有找到!" << endl;
}
else {
cout << "找到!" << (*ret).age << " " << (*ret).id << endl;
}
}
C++ set/multiset容器 学习总结的更多相关文章
- C++ STL 学习笔记__(7)Set和multiset容器
10.2.8 Set和multiset容器 set/multiset的简介 ² set是一个集合容器,其中所包含的元素是唯一的,集合中的元素按一定的顺序排列.元素插入过程是按排序规则插入,所以不能指 ...
- STL学习系列八:Set和multiset容器
1.set/multiset的简介 set是一个集合容器,其中所包含的元素是唯一的,集合中的元素按一定的顺序排列.元素插入过程是按排序规则插入,所以不能指定插入位置. set采用红黑树变体的数据结构实 ...
- 详解C++ STL multiset 容器
详解C++ STL multiset 容器 本篇随笔简单介绍一下\(C++STL\)中\(multiset\)容器的使用方法及常见使用技巧. multiset容器的概念和性质 \(set\)在英文中的 ...
- multiset容器erase函数的误用
<从缺陷中学习C/C++>第3章库函数问题,本章主要介绍库函数的使用中会遇到的问题.使用库函数可以降低软件开发的难度,提高代码编写的效率.本节为大家介绍multiset容器erase函数的 ...
- [C++提高编程] 3.8 set/ multiset 容器
文章目录 3.8 set/ multiset 容器 3.8.1 set基本概念 3.8.2 set构造和赋值 3.8.3 set大小和交换 3.8.4 set插入和删除 3.8.5 set查找和统计 ...
- Docker容器学习梳理 - 应用程序容器环境部署
关于国内Docker镜像,可以参考:Docker容器学习梳理--基础知识(2) 的Docker镜像使用. 如果我们需要在Docker环境下部署tomcat.redis.mysql.nginx.php等 ...
- Docker容器学习梳理 - 日常操作总结
使用Docker已有一段时间了,今天正好有空梳理下自己平时操作Docker时的一些命令和注意细节: Docker 命令帮助 $ sudo docker Commands: attach Attach ...
- STL之Set和multiset容器
1.Set和multiset容器 1)set是一个集合容器,其中所包含的元素是唯一的,集合中的元素按一定的顺序排列.元素插入过程是按排序规则插入,所以不能指定插入位置. 2)set采用红黑树变体的数据 ...
- STL序列式容器学习总结
STL序列式容器学习总结 参考资料:<STL源码剖析> 参考网址: Vector: http://www.cnblogs.com/zhonghuasong/p/5975979.html L ...
- STL Set和multiset 容器
STL Set和multiset 容器 set/multiset的简介 set是一个集合容器,其中所包含的元素是唯一的,集合中的元素按一定的顺序排列. 元素插入过程是按排序规则插入,所以不能指定插入位 ...
随机推荐
- JDK7-日历类--java进阶day07
1.Calendar类 用于获取或者修改时间,之前学的Date类,获取和修改时间的方法已经过时 2.Calendar对象的创建 Calendar类里面有很多抽象方法,如果创建对象就要全部重写,所以不能 ...
- 中文Markmap v2.0 现已上线,新增高效功能,老板再也留不住你下班的脚步!
介绍 Markmap.js 是一款开源项目,在 GitHub 上获得了超过 1.7 万个星的关注,它的主要功能是将 Markdown 文档可视化为思维导图. 在日常使用中,用户经常需要面对老板的&qu ...
- .net WorkFlow 流程设计
WikeFlow官网:www.wikesoft.com WikeFlow学习版演示地址:workflow.wikesoft.com WikeFlow学习版源代码下载:https://gitee.com ...
- rabbitmq防止消息的重复消费
一.rabbitmq出现消息重复的场景 A:消息消费成功,事务已经提交,ack时,机器宕机,导致没有ack成功, Broker的消息重新由unack变为ready,并发送给其他消费者 B:消息消费失败 ...
- python爬虫爬取B站视频字幕,简单的数据处理(pandas将字幕写入到CSV文件中)
上文,我们爬取到B站视频的字幕:https://www.cnblogs.com/becks/p/14540355.html 这篇,讲讲怎么把爬到的字幕写到CSV文件中,以便用于后面的分析 本文主要用到 ...
- 创建第一个属于自己的JavaWeb小程序吧
需要使用的 技术 工具: idea 2022 开发工具 MySql 5.6 数据库工具 Apache Tomcat 8.5.85 web应用部署工具 主要功能有: 用户登录 用户注册 展示列表 ...
- 腾讯云短信发送【java】
先去官网申请secretId, secretKey,然后创建对应的模板 maven引入包 <dependency> <groupId>com.tencentcloudapi&l ...
- 用AI开发AI翻译助手:初学者也能轻松做出第一个应用
在过去,学习编程往往意味着大量阅读文档.理解晦涩的语法.查找资料,甚至要面对一个接一个的报错信息,这对初学者来说常常是一个令人望而生畏的过程.但在AI时代,这一切都变得不一样了. 我最近完成了一个小项 ...
- Axure RP中后台管理系统通用原型模板元件库
Axure RP中后台管理系统通用原型方案 v2是一套通用型的中后台信息系统原型方案,可以快速扩展并输出标准美观的中后台产品原型,极大的提升输出效率和节省协作成本.方案中提供了几十套不同风格和结构的系 ...
- 关于ADB-数据包抓取-反编译工具(手机刷机使用)
1 逆向基本流程 1 获取目标app(官网,豌豆荚),尽量不要去华为应用市场,小米应用市场下载--多渠道打包,安装到手机上 2 使用抓包工具抓包分析(charles,fiddler...) 3 使用反 ...