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 ...
随机推荐
- echarts显示地图
<template> <div class="managingPatientSize"> <div id="china-map"& ...
- 文件上传change事件只执行一次的问题
参考地址:https://blog.csdn.net/john_xiaoweige/article/details/81392110 本节中的注意点: this.$refs.attenceInput. ...
- hover时行级元素变成了块级元素,导致位置错乱
在hover时,i元素变成了块级元素: 导致这两个元素各自占了一行: 最终导致样式错乱: <div class="demo"> <!-- 添加图标 和 编辑图标 ...
- Gin 框架之Cookie与Session
目录 一.Cookie和Session的由来 二.Cookie简介 1. 什么是Cookie 2. Cookie规范 3. 安全性 4. Cookie 关键配置 三.Session简介 1. 什么是S ...
- python随机种子seed的作用(强化学习常用到)
先上代码 import math import gym from gym import spaces, logger from gym.utils import seeding import nump ...
- ROS节点通信(三)action
官方wiki:http://wiki.ros.org/actionlib 目录 1.说明 2.代码示例 2.1.定义数据结构 2.1.1.goal 2.1.4.result 2.1.3.feedbac ...
- Docker从认识到实践再到底层原理(四-1)|Docker镜像仓库|超详细详解
前言 那么这里博主先安利一些干货满满的专栏了! 首先是博主的高质量博客的汇总,这个专栏里面的博客,都是博主最最用心写的一部分,干货满满,希望对大家有帮助. 高质量博客汇总 然后就是博主最近最花时间的一 ...
- Spring Boot 跨域的问题
- MySQL 8 查询优化新工具 Explain Analyze
1. Explain Analyze 介绍 Explain 是我们常用的查询分析工具,可以对查询语句的执行方式进行评估,给出很多有用的线索.但他仅仅是评估,不是实际的执行情况,比如结果中的 rows, ...
- MySQL查询语句的执行顺序
一.编写查询SQL顺序 1.select 2.from 3.join on 4.where 5.group by 6.having 7.order by 8.limit 二.MySQL执行顺序 1.f ...