我不熟悉的set
同样的我着重介绍那些我不怎么用到的系列,同时,常用的我就点一下。
我们都知道set底层是用红黑树实现的,红黑树是一种已排序的树,所以我们通过迭代器来访问节点元素的时候,并不可以改变它,如果随意改变,那排序规则就乱套了。
讲API之前,现介绍一个 对组(pair) 的概念。
对组(pair)将一对值组合成一个值,这一对值可以具有不同的数据类型,两个值可以分别用pair的两个公有属性first和second访问。
创建对组的方法
一、使用拷贝构造
pair<string, int> pair1(string("name"), 20);
cout << pair1.first << endl; //访问pair第一个值
cout << pair1.second << endl;//访问pair第二个值
二、使用make_pair
pair<string, int> pair2 = make_pair("name", 30);
cout << pair2.first << endl;
cout << pair2.second << endl;
对组可以方便的将不同数据类型作为返回值,一次返回两个数值。
构造,赋值和大小操作
set<T> st; //set默认构造函数。
set(const set &st); //拷贝构造函数
swap(set st); //交换两个集合容器
size(); //返回容器中元素的数目
empty(); //判断容器是否为空
与前几篇说的一致。
插入与删除
pair<iterator,bool> insert(elem); //在容器中插入元素。
void insert(beg,end) //插入[beg,end)范围元素
iterator erase(pos); //删除pos迭代器所指的元素,返回下一个元素的迭代器。
iterator erase(beg, end);//删除区间[beg,end)的所有元素 ,返回下一个元素的迭代器。
size_type erase(elem); //删除容器中值为elem的元素。
void clear(); //清除所有元素
这边强调一下erase和insert:
关于erase:
- 既可以删除迭代器指向的元素,也可以删除指定的元素值。与list一致。
- 删除迭代器的时候返回指向的下一个迭代器。
- 删除指定元素的时候,返回的是这个元素在容器中的个数。(set为0或1,multiset可以大于1)
关于insert:
- 唯一的一个插入元素的动作。
- 插入元素时,返回一个对组。第一个成员是指向新插入值或已存在的这个值的迭代器,第二个成员表示插入成功与否(不存在的,新插入的为真,已存在的不需新插入为假)。
- 范围插入的时候,没有返回值。
查找函数
这才是今天的重点。
iterator find(key); //查找键key是否存在,若存在,返回该键的元素的迭代器;若不存在,返回set.end();
size_type count(key); //查找键key的元素个数
iterator lower_bound(keyElem);//返回第一个key>=keyElem元素的迭代器。
iterator upper_bound(keyElem);//返回第一个key>keyElem元素的迭代器。
pair<iterator,iterator> equal_range(keyElem);//返回容器中key与keyElem相等的上下限的两个迭代器。
find函数
find函数,实际上是在红黑树中进行二叉搜索,如果找到了就返回相应位置迭代器,找不到就返回尾后迭代器end().
count函数
根据set不能重复的性质,count非零即一。
lower_bound,upper_bound和equal_range函数
很直接的,lower就是返回第一个大于等于指定元素的迭代器,而upper就是返回第一个大于指定元素的迭代器。如下所示:
int main()
{
set<int> s;
s.insert(2);
s.insert(4);
s.insert(9);
s.insert(10);
s.insert(20);
auto it1 = s.lower_bound(9);
auto it2 = s.upper_bound(9);
cout << "*it1=" << *it1 << " *it2=" << *it2 << endl;
return 0;
}
我们输出结果为:
*it1=9 *it2=10
由此可以清楚看出这两个函数的作用。
接下来我们介绍equal_range函数。equal_range的作用就是返回查找到的元素的上下限迭代器,同样遵守左闭右开的原则。而这正好是我们lower_bound和upper_bound的返回值。所以,我们可以将equal_range的返回值看做是返回一个存着lower_bound和upper_bound的返回值的对组。
我们可以验证:
int main()
{
//multiset<int> s;
set<int> s;
s.insert(2);
s.insert(4);
s.insert(9);
s.insert(9);
s.insert(9);
s.insert(10);
s.insert(20);
auto it1 = s.lower_bound(9);
auto it2 = s.upper_bound(9);
auto pair = s.equal_range(9);
if (pair.first == it1 && pair.second == it2)
cout << "equal_range pair == lower_bound & upper_bound" << endl;
return 0;
}
最后我们成功输出了
"equal_range pair == lower_bound & upper_bound"
set的排序规则
set默认是从小到大排序的,当我们要从大到小排序或者用自定义数据排序的时候,我们就要指定排序规则,同样也是使用仿函数实现:
//functor为仿函数
set<int,functor> s;
...
自己写一个仿函数即可。可参照 我不熟悉的list .
不支持回调函数。
速记:因为set用红黑树实现,插入即排序,排序一旦建立不能更改,所以要在创建set的时候就指定排序规则,而不是插入完了之后再指定。
由于set的特殊性,插入即排序建立。故有此要求。
我不熟悉的set的更多相关文章
- 高薪诚聘熟悉ABP框架的.NET高级开发工程师(2016年7月28日重发)
招聘单位是ABP架构设计交流群(134710707)群主阳铭所在的公司-上海运图贸易有限公司 招聘岗位:.NET高级开发工程师工作地点:上海-普陀区 [公司情况]上海运图贸易有限公司,是由易迅网的创始 ...
- 学习Spring——两个你熟悉的不能再熟悉的场景使用
最近公众号受邀获取了留言和赠送模板的权限,小开心(欢迎去公众号JackieZheng围观). 我们大致的了解了Spring这个框架对于依赖注入的使用和诠释可谓是淋漓尽致.因为有了Spring的这个IO ...
- vim 常用命令逐渐熟悉以及常用的配置记录
本篇博客记录的是我自己学习vim的常用命令的过程中,各个命令的逐渐熟悉的顺序(有一部分已经熟悉的命令没有列出),已经对vim编辑器本身的一些设置的记录 1.G 快速将光标切换到文件的最底部 2.u 撤 ...
- Android探索之ContentProvider熟悉而又陌生的组件
前言: 总结这篇文章之前我们先来回顾一下Android Sqlite数据库,参考文章:http://www.cnblogs.com/whoislcj/p/5506294.html,Android程序内 ...
- NSUserDefaults:熟悉与陌生(转)
转载自:http://swiftcafe.io/2016/04/04/nsuserdefaults/?hmsr=toutiao.io&utm_medium=toutiao.io&utm ...
- 20145205 实验一 Java开发环境的熟悉
实验内容 命令行下Java程序开发 IDEA下Java程序开发.调试 练习(通过命令行和Eclipse两种方式实现,在Eclipse下练习调试程序) 实现凯撒密码,并进行测试 实验要求 使用JDK编译 ...
- [dpdk] 熟悉SDK与初步使用 (四)(L3 Forwarding源码分析)
接续前节:[dpdk] 熟悉SDK与初步使用 (三)(IP Fragmentation源码分析) 前文中的最后一个问题,搁置,并没有找到答案.所以继续阅读其他例子的代码,想必定能在其他位置看到答案. ...
- [dpdk] 熟悉SDK与初步使用 (二)(skeleton源码分析)
接续前节:[dpdk] 熟悉SDK与初步使用 (一)(qemu搭建实验环境) 程序逻辑: 运行参数: 关键API: 入口函数: int rte_eal_init(int argc, char **ar ...
- [dpdk] 熟悉SDK与初步使用 (三)(IP Fragmentation源码分析)
对例子IP Fragmentation的熟悉,使用,以及源码分析. 功能: 该例子的功能有二: 一: 将IP分片? 二: 根据路由表,做包转发. 路由表如下: IP_FRAG: Socket : ad ...
- Bean熟悉替换,只替换部分属性,其他属性值不改变
Bean熟悉替换,只替换部分属性,其他属性值不改变 需要加入:asm.jar cglib-2.1.jar,用来map和bean之间的转换(比spring和反射的效率好,因为加入了缓存) packag ...
随机推荐
- 云数据库 Redis 版
首先观看视频简介 云数据库 Redis 版是一项易于部署和管理的按需数据库服务,与 Redis 协议兼容.云数据库 Redis 版通过从内存缓存中检索数据而提供高速数据读写功能,并通过同时使用内存和硬 ...
- centos 7 源码安装 mysql 5.6
下载 mysql 安装包 $ wget https://cdn.mysql.com//Downloads/MySQL-5.6/mysql-5.6.44.tar.gz # or $ curl -O ht ...
- vue-router动态路由设置参数可选
在日常工作中,我们需要将匹配到的所有路由,映射到一个组件上. 如下代码想要达到的效果: 不传page和id,则映射到user默认list页面 传page和id,根据page不同,显示不同的页面 问题 ...
- 接口测试-免费开放的api
归纳一些不错的免费开放的api 1.Apizza免费开放的Api接口 链接: https://www.jianshu.com/p/e6f072839282 接口文档:https://www.apiop ...
- Peter and Snow Blower CodeForces - 613A (点到线段距离)
大意: 给定多边形, 给定点$P$, 求一个以$P$为圆心的最小的圆环包含整个多边形. #include <iostream> #include <cmath> #define ...
- hbase启动后HMaster几秒后死掉
通过 http://s128:16010 无法访问Hbase Web端 查看master日志,有报错: 2019-08-30 16:27:35,137 ERROR [master/s128:16000 ...
- C++ 标准库字符串类使用
标准库中的字符串类 C++语言直接支持C语言所有概念. C++中没有原生的字符串类型. 由于C++中没有原生的字符串类型,C++标准库提供了string类型. 1.string 直接支持字符串链接 2 ...
- 部署etcd集群
部署etcd集群 第一步:先拉取etcd二进制压缩包 wget https://github.com/coreos/etcd/releases/download/v3.3.2/etcd-v3.3.2- ...
- 冒泡排序(java可直接跑,算法思想等小儿科不多说直接上代码)
import java.util.Arrays; /** *冒泡排序:时间复杂度O(N^2),空间复杂度O(1),稳定的排序 * 每趟确定一个元素的位置,所以需要arr.length趟排序, */pu ...
- N4_75条语法
1. コ/ソ/ア/ド体系 -(こ.そ.あ.ど)れ/-(こ.そ.あ.ど)の A:-(こ.そ.あ.ど)れ 接续: 指示代词和场所代词,分近称.中称.远称.疑问称. 意思: 这个,那个,那个,哪个 例:これ ...