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是一个集合容器,其中所包含的元素是唯一的,集合中的元素按一定的顺序排列. 元素插入过程是按排序规则插入,所以不能指定插入位 ...
随机推荐
- 【Ubuntu】在Ubuntu上安装微信
[Ubuntu]在Ubuntu上安装微信 零.说明 微信官网最近发布了Linux的测试版本,实际使用下来与Windows版本相差不多,本文介绍如何在Ubuntu(Debian系)上安装Linux版本的 ...
- 【软件】Ubuntu下QT的安装和使用
[软件]Ubuntu下QT的安装和使用 零.前言 QT是应用得比较广泛的程序框架,是因为其跨平台特性比较好,且用C/C++作为开发语言,性能也比较好,故本文介绍如何安装和使用QT,用的版本是QT 6. ...
- Aspnet Core 10 Preview3已对最小API提供参数验证支持
前言 相信大家都或多或少用上了Minimal API,快速简洁,性能炸裂,是快速开发API端口的不二之选!但是呢目前正式版为止 最小API还并不内置支持对请求参数的内置验证支持,比如[Required ...
- Web前端入门第 36 问:多图细说 CSS grid 网格布局(一)父元素容器相关属性
grid 网格布局与 flex 弹性盒子布局一样,都需要控制 容器 跟 子元素 的样式才能做出想要的效果,部分场景只控制 容器 样式也行. grid 样式属性 一大堆 属性 来袭~~ 与网格相关的 C ...
- 一、C语言概述
声明 本文内容大多取自<高级语言程序设计一书>,为本人学习笔记记录,切勿用于商业用途. 第一节 计算机发展 电子计算机已经历的四个发展时代: 第一代:20 世纪 50 年代,主要采用真空电 ...
- 关于μkeil v5.40(keil5) 如何使用STM32(ARM)虚拟下载器进行Proteus联调
最近我心血来潮,想用Proteus+keil5进行联调,但仔细在网上一找,全是某SDN扒下来的陈年老黑X,都快转出数字包浆了还在用,完完全全跟不上时代,也全是51单片机的版本,STM32(ARM)根本 ...
- mysql服务未启动报错2003-Can't connect to MySQL server on 'localhost' (10061 "Unknown error")
解决方法:开启mysql服务再试试 管理员身份运行cmd 开启mysql服务net start mysql 关闭mysql服务 net stop mysql
- OSCP靶场练习从零到一之TR0LL: 1
本系列为 OSCP 证书学习训练靶场的记录,主要涉及到 vulnhub.HTB 上面的 OSCP 靶场,后续慢慢更新 1.靶场介绍 名称: TR0LL: 1 下载地址: https://www.vul ...
- div中文本超过指定宽度自动换行
一.场景 因为想要一个页面显示完所有的文本,所以要进行文本处理 二.代码 宽度超过1800px就自动换行 <div style="word-break: break-all; word ...
- LR梯度下降法MSE演练
同步进行一波网上代码搬砖, 先来个入门的线性回归模型训练, 基于梯度下降法来, 优化用 MSE 来做. 理论部分就不讲了, 网上一大堆, 我自己也是理解好多年了, 什么 偏导数, 梯度(多远函数一阶偏 ...