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. 【小实验】使用 wrk 的 docker 容器来压测另一个容器

    作者:张富春(ahfuzhang),转载时请注明作者和引用链接,谢谢! cnblogs博客 zhihu Github 公众号:一本正经的瞎扯 GET 请求 想压测容器环境的服务性能,发现两个麻烦: 本 ...

  2. .net web发布至阿里云服务器

    1.发 布网站第一步:右键网站主项目,选择 发布网站.如下图 第二步 填写发布网站的相关配置,选择配置文件,新建配置文件 第三步 选择发布的文件存放的位置 第四步,选择Release 再点击下一步,点 ...

  3. String 中的Trim

    Trim 切除首尾指定字符 var newStr=""; char[] trimChars={'@','#','$',' '}; string strC="@Hello# ...

  4. 从零开始配置 vim(17)——快捷键提示

    之前我们定义了各种各样的快捷键,有为了增强功能自定义的,有针对插件的.数量一多有的时候就不那么容易记忆了.要是每次要去配置文件找我定义了哪些快捷键肯定会影响使用的. 本篇将要介绍一个插件,它是快捷键的 ...

  5. 解锁搜索新境界!让文本语义匹配助你轻松找到你需要的一切!(快速上手baseline)

    解锁搜索新境界!让文本语义匹配助你轻松找到你需要的一切!(快速上手baseline) 实现了多种相似度计算.匹配搜索算法,支持文本.图像,python3开发,pip安装,开箱即用. 文本相似度计算(文 ...

  6. 【3】opencv_contrib 4.3.0库配置+opencv安装

    相关文章: [1]windows下安装OpenCV(4.3)+VS2017安装+opencv_contrib4.3.0配置 [2]Visual Studio 2017同时配置OpenCV2.4 以及O ...

  7. easyexcel只通过表名来动态查询并动态导出数据

    EasyExcel动态表头即动态数据生成 1️⃣ 业务需求 需要将数据库中的所有表放在一个下拉框中,下拉框支持模糊查询到相关的表,然后通过这个表名查询到数据库的数据,切换不同的表查询出来相关表的列和数 ...

  8. java在服务器上创建文件(以shell脚本为例)并执行

    java在服务器上创建文件(以shell脚本为例)并执行 1️⃣ 首先写个方法,来在服务器上创建脚本 package com.preciouslove.xinxin_emo.controller; i ...

  9. 记录一则exachk进程占用大量CPU资源

    有Exadata客户在进行exachk巡检之后反馈,发现系统中,exachk进程占用了大量CPU资源. 了解之前的变更,只是巡检之前升级了AHF,然后进行标准的exachk巡检. 现象: 目前机器整体 ...

  10. jackson、objectMapper 、JsonAlias、JsonProperty、json。序列化和反序列化研究。

    总结: @JsonAlias:序列化出来是一定是真名,反序列化时可以传真名(驼峰)Json也可以传别名(下划线)Json @JsonProperty:序列化出来一定是别名,反序列化时也只能传别名Jso ...