Set,Multiset,Iterator(迭代器)详解
Set,Multiset,Iterator(迭代器)
Iterator:迭代器
我们可以发现所谓一些数据结构比如说数组和链表,它们都有一些相似的性质。我们看下面两个例子:
- 数组:定义数组\(int~a[10]\),第一个元素的指针为\(a\),第二个元素的指针为\(a+1\),第三个元素的指针为\(a+2\),等等、
- 链表:对于一个链表\(list\text{<}int\text{>}~mylist;\),它的储存方式是链式储存,内存里的地址不是连续的,而是分散的,它只能用\(next\)或者\(last\)来访问元素。
为了统一这两种储存方式的指针,我们引入了一种更加高级的指针,叫做\(iterator\),现在定义一个\(iterator\):\(std\text{::}set\text{<}int\text{>::}iterator~iter\),这种指针可以支持以下的操作:
- \(iter\text{++}\) :将\(iter\)指向下一个元素的地址
- \(iter-\hspace{0.2pt}-\) :将\(iter\)指向上一个元素的地址
- \(*iter\):获得\(iter\)指针所指向地址所储存的值
Set / Multiset
\(Set\)是指集合,它有集合所拥有的性质:元素的唯一性。而\(Multiset\)则没有前面所说的性质,会存在形如:\(\{0,0,1,1,2\}\)这样的集合。
这两种数据结构是默认会进行升序排列,用的是类似于平衡二叉搜索树。
以下是一种使用\(iterator\)的例子:
#include <iostream>
#include <set>
#include <algorithm>
int main() {
std::set<int> s;
s.insert(2); s.insert(1); s.insert(10);
std::set<int>::iterator iter = s.end();
iter --;
std::cout << *iter << std::endl; // 10
iter --;
std::cout << *iter << std::endl; // 2
iter --;
std::cout << *iter << std::endl; // 1
}
通过上面的例子,不难发现,\(end()\)指向的是不存在于\(set\)的一个地址,是最后一个元素后的一个地址。
注:
几乎所有\(set\)的函数和返回值返回的都是\(iterator\)。
所有的\(lower\_bound()\)和\(upper\_bound()\)都是遵循左闭右开,即\([a,b)\)的形式
举例:
对于集合\(\{1,2,3,4,5,6,8,9\}\)
\(*lower\_bound(7) = *upper\_bound(7) = 8\)
对于数组\(\{1,2,3,3,3,3,3,4\}\)
\(*upper\_bound(3) - *lower\_bound(3) = count(3) = 5\)
对于集合\(\{1,2,3,4,5,6,7,8,9\}\)
\(lower\_bound(10) = upper\_bound(10) = set.end()\)
Set,Multiset,Iterator(迭代器)详解的更多相关文章
- 黑马----JAVA迭代器详解
JAVA迭代器详解 1.Interable.Iterator和ListIterator 1)迭代器生成接口Interable,用于生成一个具体迭代器 public interface Iterable ...
- c/c++ 标准库 插入迭代器 详解
标准库 插入迭代器 详解 插入迭代器作用:copy等函数不能改变容器的大小,所以有时copy先容器是个空的容器,如果不使用插入迭代器,是无法使用copy等函数的. 例如下面的代码就是错误的: list ...
- c++迭代器(iterator)详解
1. 迭代器(iterator)是一中检查容器内元素并遍历元素的数据类型.(1) 每种容器类型都定义了自己的迭代器类型,如vector:vector<int>::iterator iter ...
- Python迭代器详解
最近在看两个github项目的代码时对迭代器有些困惑,因此写一篇笔记以理清脉络,经过两天的修改完善对迭代器有了一个初步的理解,相信会比网上绝大多数笔记有用些. 一.基础概念 在进行具体的迭代类和迭代函 ...
- Java中的Enumeration、Iterable和Iterator接口详解
前言 在看各类Java书籍或者博文的时候,总是会遇到Enumeration.Iterable和Iterator这三个接口,如果对这几个接口不是很明白的话,总会让自己看着看着就迷惑了,正好这周末,抽空把 ...
- [C++ STL] 迭代器(iterator)详解
背景:指针可以用来遍历存储空间连续的数据结构,但是对于存储空间非连续的,就需要寻找一个行为类似指针的类,来对非数组的数据结构进行遍历.因此,我们引入迭代器概念. 一.迭代器(iterator)介绍 ...
- Python学习笔记:迭代器(Iterator)详解
一.可迭代的对象(Iterable) 1.定义:可以直接用在循环的数据类型,如list,tuple,dict,set,str,还有generator(生成器), 和带yield的函数,这些直接可以用在 ...
- java的迭代器详解
迭代器的引出 在jdk1.5版本之前是没有 foreach的,然而1.5版本就加上了foreach,而引入的新的foreach功能并不是在jvm上进行改进的因为代价太高,甲骨文工程师想到了一个比较好的 ...
- C#基础の迭代器详解
一.什么是迭代器 迭代器(iterator)有时又称游标(cursor)是程序设计的软件设计模式,可在容器(container,例如链表或阵列)上遍访的接口,设计人员无需关心容器的内容. 迭代器模式是 ...
- python中的迭代器详解
#原创,转载请先联系 理论性的东西有点枯燥,耐心点看- 1.迭代是什么? 我们知道可以对list,tuple,dict,str等数据类型使用for...in的循环语法,从其中依次取出数据,这个过程叫做 ...
随机推荐
- swiper 使用参考 禁止手动滑动 监听事件
最外层容器加类名 swiper-no-swiping 监听切换事件 onTransitionEnd: function(swiper){ console.log('过渡结束'); }
- koa2入门--03.koa中间件以及中间件执行流程
//中间件:先访问app的中间件的执行顺序类似嵌套函数,由外到内,再由内到外 //应用级中间件 const koa = require('koa'); var router = require('ko ...
- Servlet 常用类
Servlet 是一套标准的接口规范,当用户通过web请求来访问服务器时,由web容器根据配置调用我们实现的对应的servlet对象来提供服务.同时为了方便开发,servlet标准中也提供了许多常用的 ...
- Android 隐藏顶部菜单栏
Android 隐藏状态栏 在Activity中: getWindow().addFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN); 在fragmen ...
- VRChat之blender2.8版本设置
推荐先看:VRChat模型制作及上传总篇(包含总流程和所需插件):https://www.cnblogs.com/raitorei/p/12015876.html blender2.8视频:https ...
- 记一次线上 OOM 和性能优化
大家好,我是鸭血粉丝(大家会亲切的喊我 「阿粉」),是一位喜欢吃鸭血粉丝的程序员,回想起之前线上出现 OOM 的场景,毕竟当时是第一次遇到这么 紧脏 的大事,要好好记录下来. 1 事情回顾 在某次周五 ...
- 【他山之石】mysql编码问题总结
有些问题可能比较基础,但是没有经过系统学习还是可能会出错,记录下. 这次是mysql的编码问题. 背景是部署新的测试环境,给了一台服务器还有在另一个环境下的mysql,配置过程中发现mysql编码有问 ...
- 【题解】P1712 [NOI2016]区间(贪心+线段树)
[题解]P1712 [NOI2016]区间(贪心+线段树) 一个observe是,对于一个合法的方案,将其线段长度按照从大到小排序后,他极差的来源是第一个和最后一个.或者说,读入的线段按照长度分类后, ...
- Google被墙怎么办?
Google被墙怎么办? 1 声明 请小伙伴们遵守法律法规,我们只是为了更好的查询学习资料. 想使用Google查询相关资料 想使用Google账号管理收藏夹 想使用Google商店安装软件 == 2 ...
- 开发工具篇:JAVA和IntelliJ IDEA相恋
开发工具篇:JAVA和IntelliJ IDEA相恋 idea是什么? IDEA 全称 IntelliJ IDEA,是java语言开发的集成环境,IntelliJ在业界被公认为最好的java开发工具之 ...