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类型的更多相关文章

  1. c++ STL 常用容器元素类型相关限制 指针 引用

    c++ 的 STL 中主要有 vector , list, map, set  , multimap,multiset 这些容器完全支持使用内置类型和指针(指针注意内存泄露问题). 就是说乱用智能指针 ...

  2. STL容器

    啦啦啦,今天听啦高年级学长讲的STL容器啦,发现有好多东西还是有必要记载的,毕竟学长是身经百战的,他在参加各种比赛的时候积累的经验可不是一天两天就能学来的,那个可是炒鸡有价值的啊,啊啊啊啊啊 #inc ...

  3. c++ stl容器set成员函数介绍及set集合插入,遍历等用法举例

    c++ stl集合set介绍 c++ stl集合(Set)是一种包含已排序对象的关联容器.set/multiset会根据待定的排序准则,自动将元素排序.两者不同在于前者不允许元素重复,而后者允许. 1 ...

  4. 【转】c++中Vector等STL容器的自定义排序

    如果要自己定义STL容器的元素类最好满足STL容器对元素的要求    必须要求:     1.Copy构造函数     2.赋值=操作符     3.能够销毁对象的析构函数    另外:     1. ...

  5. STL容器的适用情况

     转自http://hsw625728.blog.163.com/blog/static/3957072820091116114655254/ ly; mso-default-props:yes; m ...

  6. STL容器的本质

    http://blog.sina.com.cn/s/blog_4d3a41f40100eof0.html 最近在学习unordered_map里面的散列函数和相等函数怎么写.学习过程中看到了一个好帖子 ...

  7. 不要在公共接口中传递STL容器

    最近的一个项目,是开发一个framework,提供给公司内部不同的产品线使用. 之间遇到的一个问题,就是STL容器的使用, 而结论是不要在公共接口中传递STL容器: 这里说的STL容器,但主要则是指容 ...

  8. STL容器的内存分配

    这篇文章参考的是侯捷的<STL源码剖析>,所以主要介绍的是SGI STL实现版本,这个版本也是g++自带的版本,另外有J.Plauger实现版本对应的是cl自带的版本,他们都是基于HP实现 ...

  9. 转:STL容器里存放对象还是指针

    一.问题的引出: 容器可以存放对象,可以存放指针,这里要谈的是两者的使用问题.就是什么时候存放对象更好,什么时候存放指针更好? 二.问题的分析过程: 1. 首先说下stl容器的工作方式   对于内建类 ...

  10. STL容器总结

    一. 种类: 标准STL序列容器:vector.string.deque和list. 标准STL关联容器:set.multiset.map和multimap. 非标准序列容器slist和rope.sl ...

随机推荐

  1. 在k8s中的控制器和部署服务-ReplicationController和ReplicaSet

    pod 代表了 k8s 中的基本部署单元,但是在实际应用场景中,服务不可能是单个pod运行的,否则会出现"单点".在 k8s 中对 pod 的托管部署,专门抽象成了单独的资源.其中 ...

  2. 大数据面试题集锦-Hadoop面试题(一)

    目录 1.集群的最主要瓶颈 2.Hadoop运行模式 3.Hadoop生态圈的组件并做简要描述 4.解释"hadoop"和"hadoop 生态系统"两个概念 5 ...

  3. kettle(docker版)系列文章02---hello world

    目标:将mysql库中表的数据定时转到另外一个表中 1.在mysql中新建目标表test_kettle,有字段id,productName,createtime 2.连接mysql数据库 DB连接-- ...

  4. Go中sync.map使用小结

    sync.map 前言 深入了解下 查看下具体的实现 Load Store Delete LoadOrStore 总结 流程图片 参考 sync.map 前言 Go中的map不是并发安全的,在Go1. ...

  5. PaddleNLP基于ERNIR3.0文本分类以CAIL2018-SMALL数据集罪名预测任务为例【多标签】

    相关项目链接: Paddlenlp之UIE模型实战实体抽取任务[打车数据.快递单] Paddlenlp之UIE分类模型[以情感倾向分析新闻分类为例]含智能标注方案) 应用实践:分类模型大集成者[Pad ...

  6. LyScriptTools 模块类API接口手册

    LyScriptTools工具包是在LyScript模块基础上封装的工具包,其主要是二次封装LyScript插件实现的一些新功能,或者将特定功能组件拆分开形成的独立模块,此类模块可实现更加精细化的功能 ...

  7. C/C++ Qt 监控文件状态变化

    实现对特定文件的监控,Qt中提供了QFileSystemWatcher调用这个接口可以快速实现监控功能,当有文件发生变化是自动触发并输出文件具体信息. filesystem.h #ifndef FIL ...

  8. spark读取空orc文件时报错java.lang.RuntimeException: serious problem at OrcInputFormat.generateSplitsInfo

    问题复现: G:\bigdata\spark-2.3.3-bin-hadoop2.7\bin>spark-shell 2020-12-26 10:20:48 WARN NativeCodeLoa ...

  9. CF145E Lucky Queries 题解

    题目链接:CF 或者 洛谷 前置知识点:序列操作 本文关键词 约定俗称:因为频繁敲最长不下降子序列 \(LNCS\) 和最长不上升子序列 \(LNIS\) 太麻烦了,下文将 \(000011111\) ...

  10. CH57x/CH58x/CH59x主从机主动发起断连

    如果在做应用的时需要同时使用使用两块板子分别做主从机或者使用一块板子做单独的从机: 这是我们需要按下某个按键或者发送某条指令主机或者从机主动断开与对方的连接且设备不需要复位: 主机端我们可以调用这样一 ...