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 ...
随机推荐
- iphone(ios)不同设备的内存和游戏不闪退峰值
ios内存限制 不同内存的苹果机型上(1G,2G,3G,4G-),游戏内存的峰值一般最高多少能保证不闪退? 一般来讲最保险的就是不超过机器总内存的50%,具体每个机型的内存限制在列出在下面. 原贴:& ...
- TienChin 渠道管理-表创建
在若依当中,有个槽点,就是数据库当中的删除标识状态一般 0 是 false,1 是 true,在若依当中反而 0 是 true,1 是 false. 渠道表设计,我这里就直接贴成品的创建表 SQL: ...
- 英伟达系列显卡大解析B100、H200、L40S、A100、A800、H100、H800、V100如何选择,含架构技术和性能对比带你解决疑惑
英伟达系列显卡大解析B100.H200.L40S.A100.A800.H100.H800.V100如何选择,含架构技术和性能对比带你解决疑惑 近期,AIGC领域呈现出一片繁荣景象,其背后离不开强大算力 ...
- ElasticSearch实战指南必知必会:安装分词器、高级查询、打分机制
ElasticSearch实战指南必知必会:安装中文分词器.ES-Python使用.高级查询实现位置坐标搜索以及打分机制 1.ElasticSearch之-安装中文分词器 elasticsearch ...
- C/C++ 感染标志与空字节感染
C/C++ 通过搜索PE结构中的空隙部分,对指定文件写入感染标志,作用是,如果程序被感染过则不再继续感染,而搜索空字节,则是要将恶意代码动态的填充到可执行文件中,并劫持执行流,以下代码就是这两种代码的 ...
- 分布式压测之locust和Jmeter的使用
受限于单台机器的配置问题,我们在单台机器上达不到一个很高的压测并发数,那这个时候就需要引入分布式压测 分布式压测原理: 一般通过局域网把不同测试计算机链接到一起,达到测试共享.分散操作.集中管理的目的 ...
- ABC 311 A - E
ABC 311 A - E 不提供代码 A 题意:求一个字符串的第一个 ABC 最早出现的位置,可以打乱顺序,可以间隔 建立三个变量,然后以此判断即可,直到三种字符都出现就可以了 B 题意:给定每个人 ...
- 【Flink入门修炼】1-2 Mac 搭建 Flink 源码阅读环境
在后面学习 Flink 相关知识时,会深入源码探究其实现机制.因此,需要现在本地配置好源码阅读环境. 本文搭建环境: Mac M1(Apple Silicon) Java 8 IDEA Flink 官 ...
- DELPHI IDE 代码智能提示
- Hive-分区取TOP N问题
问题背景 设想你对用户在不同品类上的行为打分聚合后得到这样一个表 user_cate_score uid cate score 1 1 0.3 2 2 0.5 8 3 0.9 现在,你想将每个品类的T ...