C++ STL容器 set类型
C++ STL容器 set类型
set是C++引入的二叉树数据结构
特点:
- 自动将元素排序
- 插入和删除查找logn
- 必须元素支持严格的弱顺序
- 不能改变元素的值
代码
using Group = std::set<float>;
// 初始化
Group a={1.0f,4.0f,3.3,7.8,9.1,0.2};
Group b=a;
Group c(a);
Group d(c.begin(),c.end());
for(const auto& v:d)
std::cout<<v<<'\n';
std::cout<<"d.empty()="<<d.empty()<<'\n';
std::cout<<"d.size()="<<d.size()<<'\n';
std::cout<<"d.max_size()="<<d.max_size()<<'\n';
// 支持 operator == != <> <= >=
auto keycomp = d.key_comp(); //获取d集合的键比较对象,并将其存储在名为keycomp的变量中。
auto valuecomp = d.value_comp(); //获取d集合的值比较对象,并将其存储在名为valuecomp的变量中。
// 赋值
c = d;
// 交换
a.swap(d);
std::swap(a,d);
// 迭代器相关
a.begin();
a.end();
a.cbegin();
a.cend();
a.rbegin();
a.rend();
a.crbegin();
a.crend();
auto iter1 = a.begin();
auto find1 = d.find(1.0f);
std::cout<<"d.count(1.0f)="<<d.count(1.0f)<<'\n';
auto find2 = d.lower_bound(1.0f); //返回>=这个值的第一个迭代器位置
// 注意,lower_bound 不保证返回的迭代器指向的元素在集合中确实存在
auto find3 = d.upper_bound(1.0f); //返回>这个值的第一个迭代器位置
auto find4 = d.equal_range(1.0f); //返回上面两个函数的位置
std::cout<<"b="<<'\n';
for(const auto& v:b)
std::cout<<v<<'\n';
auto state = b.insert(100.0f);
b.insert(c.begin(),c.end());
b.emplace(11.1f);
b.emplace_hint(b.end(),9.0f);
std::cout<<"2b="<<'\n';
for(const auto& v:b)
std::cout<<v<<'\n';
set的自定义比较
我们如果想要让自定义的类型放入set中自动排序,需要编写额外的函数。
注意set不允许修改元素,所以请把函数设置成const
struct compName{
template<class T>
bool operator()(const T& t1,const T& t2)const
{
return t1.name1() <t2.name1();
}
};
struct compAge{
template<class T>
bool operator()(const T& t1,const T& t2)const
{
return t1.age1() <t2.age1();
}
};
class Person{
private :
std::string name;
int age;
public:
Person(int age,std::string name):age(age),name(std::move(name))
{}
int age1()const {return age;};
const std::string& name1()const {return name;};
void show()const {
std::cout<<"name "<<name<<" ,age "<<age<<'\n';
}
};
void mytest()
{
Person p1(10,"A");
Person p2(15,"O");
Person p3(13,"B");
Person p4(1,"P");
using Group1 = std::set<Person,compAge> ;
using Group2 = std::set<Person,compName> ;
Group1 gp={p1,p2,p3,p4};
Group2 gp2={p1,p2,p3,p4};
std::cout<<"Age sort:"<<'\n';
for( auto& v:gp)
v.show();
std::cout<<"Name sort:"<<'\n';
for( auto& v:gp2)
v.show();
}
输出结果
Age sort:
name P ,age 1
name A ,age 10
name B ,age 13
name O ,age 15
Name sort:
name A ,age 10
name B ,age 13
name O ,age 15
name P ,age 1
C++ STL容器 set类型的更多相关文章
- c++ STL 常用容器元素类型相关限制 指针 引用
c++ 的 STL 中主要有 vector , list, map, set , multimap,multiset 这些容器完全支持使用内置类型和指针(指针注意内存泄露问题). 就是说乱用智能指针 ...
- STL容器
啦啦啦,今天听啦高年级学长讲的STL容器啦,发现有好多东西还是有必要记载的,毕竟学长是身经百战的,他在参加各种比赛的时候积累的经验可不是一天两天就能学来的,那个可是炒鸡有价值的啊,啊啊啊啊啊 #inc ...
- c++ stl容器set成员函数介绍及set集合插入,遍历等用法举例
c++ stl集合set介绍 c++ stl集合(Set)是一种包含已排序对象的关联容器.set/multiset会根据待定的排序准则,自动将元素排序.两者不同在于前者不允许元素重复,而后者允许. 1 ...
- 【转】c++中Vector等STL容器的自定义排序
如果要自己定义STL容器的元素类最好满足STL容器对元素的要求 必须要求: 1.Copy构造函数 2.赋值=操作符 3.能够销毁对象的析构函数 另外: 1. ...
- STL容器的适用情况
转自http://hsw625728.blog.163.com/blog/static/3957072820091116114655254/ ly; mso-default-props:yes; m ...
- STL容器的本质
http://blog.sina.com.cn/s/blog_4d3a41f40100eof0.html 最近在学习unordered_map里面的散列函数和相等函数怎么写.学习过程中看到了一个好帖子 ...
- 不要在公共接口中传递STL容器
最近的一个项目,是开发一个framework,提供给公司内部不同的产品线使用. 之间遇到的一个问题,就是STL容器的使用, 而结论是不要在公共接口中传递STL容器: 这里说的STL容器,但主要则是指容 ...
- STL容器的内存分配
这篇文章参考的是侯捷的<STL源码剖析>,所以主要介绍的是SGI STL实现版本,这个版本也是g++自带的版本,另外有J.Plauger实现版本对应的是cl自带的版本,他们都是基于HP实现 ...
- 转:STL容器里存放对象还是指针
一.问题的引出: 容器可以存放对象,可以存放指针,这里要谈的是两者的使用问题.就是什么时候存放对象更好,什么时候存放指针更好? 二.问题的分析过程: 1. 首先说下stl容器的工作方式 对于内建类 ...
- STL容器总结
一. 种类: 标准STL序列容器:vector.string.deque和list. 标准STL关联容器:set.multiset.map和multimap. 非标准序列容器slist和rope.sl ...
随机推荐
- 本地搭建playground
本文主要是记录我搭建go playground的步骤. 1.安装docker 如果你使用的Ubuntu,docker的安装步骤可以参见这里,这是我之前写的在Ubuntu18.04下安装fabric,其 ...
- TienChin 渠道管理-删除渠道
更改一下菜单权限,将删除渠道的 delete 改为 remove: ChannelController.java @PreAuthorize("hasPermission('tienchin ...
- 【二】tensorflow调试报错、TF深度学习强化学习教学
相关文章: [一]tensorflow安装.常用python镜像源.tensorflow 深度学习强化学习教学 [二]tensorflow调试报错.tensorflow 深度学习强化学习教学 [三]t ...
- C/C++ 实现枚举网上邻居信息
在Windows系统中,通过网络邻居可以方便地查看本地网络中的共享资源和计算机.通过使用Windows API中的一些网络相关函数,我们可以实现枚举网络邻居信息的功能,获取连接到本地网络的其他计算机的 ...
- Python 使用Scapy构造特殊数据包
Scapy是一款Python库,可用于构建.发送.接收和解析网络数据包.除了实现端口扫描外,它还可以用于实现各种网络安全工具,例如SynFlood攻击,Sockstress攻击,DNS查询攻击,ARP ...
- 2.5 PE结构:导入表详细解析
导入表(Import Table)是Windows可执行文件中的一部分,它记录了程序所需调用的外部函数(或API)的名称,以及这些函数在哪些动态链接库(DLL)中可以找到.在Win32编程中我们会经常 ...
- .NET NativeAOT 指南
.NET NativeAOT 指南 随着 .NET 8 的发布,一种新的"时尚"应用模型 NativeAOT 开始在各种真实世界的应用中广泛使用. 除了对 NativeAOT 工具 ...
- AI PC两年要大卖1亿台!就靠它了
Intel在中国北京召开了主题为"AI无处不在,创芯无所不及"的2023Intel新品发布会暨AI技术创新派对,正式发布了代号为"Meteor Lake"的面向 ...
- 目录 - JavaScript指南
目 录 第一章. JavaScript概述 第二章. JavaScript语法基础 第三章. JavaScript编程规范 第四章. JavaScript工具集合 第五章. JavaSc ...
- Java开发学习(二十)----AOP总结
一.AOP的核心概念 概念:AOP(Aspect Oriented Programming)面向切面编程,一种编程范式 作用:在不惊动原始设计的基础上为方法进行功能增强 核心概念 代理(Proxy): ...