-------------------------------------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容器 学习总结的更多相关文章

  1. C++ STL 学习笔记__(7)Set和multiset容器

    10.2.8 Set和multiset容器 set/multiset的简介 ²  set是一个集合容器,其中所包含的元素是唯一的,集合中的元素按一定的顺序排列.元素插入过程是按排序规则插入,所以不能指 ...

  2. STL学习系列八:Set和multiset容器

    1.set/multiset的简介 set是一个集合容器,其中所包含的元素是唯一的,集合中的元素按一定的顺序排列.元素插入过程是按排序规则插入,所以不能指定插入位置. set采用红黑树变体的数据结构实 ...

  3. 详解C++ STL multiset 容器

    详解C++ STL multiset 容器 本篇随笔简单介绍一下\(C++STL\)中\(multiset\)容器的使用方法及常见使用技巧. multiset容器的概念和性质 \(set\)在英文中的 ...

  4. multiset容器erase函数的误用

    <从缺陷中学习C/C++>第3章库函数问题,本章主要介绍库函数的使用中会遇到的问题.使用库函数可以降低软件开发的难度,提高代码编写的效率.本节为大家介绍multiset容器erase函数的 ...

  5. [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查找和统计 ...

  6. Docker容器学习梳理 - 应用程序容器环境部署

    关于国内Docker镜像,可以参考:Docker容器学习梳理--基础知识(2) 的Docker镜像使用. 如果我们需要在Docker环境下部署tomcat.redis.mysql.nginx.php等 ...

  7. Docker容器学习梳理 - 日常操作总结

    使用Docker已有一段时间了,今天正好有空梳理下自己平时操作Docker时的一些命令和注意细节: Docker 命令帮助 $ sudo docker Commands: attach Attach ...

  8. STL之Set和multiset容器

    1.Set和multiset容器 1)set是一个集合容器,其中所包含的元素是唯一的,集合中的元素按一定的顺序排列.元素插入过程是按排序规则插入,所以不能指定插入位置. 2)set采用红黑树变体的数据 ...

  9. STL序列式容器学习总结

    STL序列式容器学习总结 参考资料:<STL源码剖析> 参考网址: Vector: http://www.cnblogs.com/zhonghuasong/p/5975979.html L ...

  10. STL Set和multiset 容器

    STL Set和multiset 容器 set/multiset的简介 set是一个集合容器,其中所包含的元素是唯一的,集合中的元素按一定的顺序排列. 元素插入过程是按排序规则插入,所以不能指定插入位 ...

随机推荐

  1. JDK7-日历类--java进阶day07

    1.Calendar类 用于获取或者修改时间,之前学的Date类,获取和修改时间的方法已经过时 2.Calendar对象的创建 Calendar类里面有很多抽象方法,如果创建对象就要全部重写,所以不能 ...

  2. 中文Markmap v2.0 现已上线,新增高效功能,老板再也留不住你下班的脚步!

    介绍 Markmap.js 是一款开源项目,在 GitHub 上获得了超过 1.7 万个星的关注,它的主要功能是将 Markdown 文档可视化为思维导图. 在日常使用中,用户经常需要面对老板的&qu ...

  3. .net WorkFlow 流程设计

    WikeFlow官网:www.wikesoft.com WikeFlow学习版演示地址:workflow.wikesoft.com WikeFlow学习版源代码下载:https://gitee.com ...

  4. rabbitmq防止消息的重复消费

    一.rabbitmq出现消息重复的场景 A:消息消费成功,事务已经提交,ack时,机器宕机,导致没有ack成功, Broker的消息重新由unack变为ready,并发送给其他消费者 B:消息消费失败 ...

  5. python爬虫爬取B站视频字幕,简单的数据处理(pandas将字幕写入到CSV文件中)

    上文,我们爬取到B站视频的字幕:https://www.cnblogs.com/becks/p/14540355.html 这篇,讲讲怎么把爬到的字幕写到CSV文件中,以便用于后面的分析 本文主要用到 ...

  6. 创建第一个属于自己的JavaWeb小程序吧

    需要使用的 技术 工具: idea 2022  开发工具 MySql 5.6  数据库工具 Apache Tomcat 8.5.85   web应用部署工具 主要功能有: 用户登录 用户注册 展示列表 ...

  7. 腾讯云短信发送【java】

    先去官网申请secretId, secretKey,然后创建对应的模板 maven引入包 <dependency> <groupId>com.tencentcloudapi&l ...

  8. 用AI开发AI翻译助手:初学者也能轻松做出第一个应用

    在过去,学习编程往往意味着大量阅读文档.理解晦涩的语法.查找资料,甚至要面对一个接一个的报错信息,这对初学者来说常常是一个令人望而生畏的过程.但在AI时代,这一切都变得不一样了. 我最近完成了一个小项 ...

  9. Axure RP中后台管理系统通用原型模板元件库

    Axure RP中后台管理系统通用原型方案 v2是一套通用型的中后台信息系统原型方案,可以快速扩展并输出标准美观的中后台产品原型,极大的提升输出效率和节省协作成本.方案中提供了几十套不同风格和结构的系 ...

  10. 关于ADB-数据包抓取-反编译工具(手机刷机使用)

    1 逆向基本流程 1 获取目标app(官网,豌豆荚),尽量不要去华为应用市场,小米应用市场下载--多渠道打包,安装到手机上 2 使用抓包工具抓包分析(charles,fiddler...) 3 使用反 ...