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的循环语法,从其中依次取出数据,这个过程叫做 ...
随机推荐
- HDU 6444 Neko's loop(单调队列)
Neko has a loop of size nn. The loop has a happy value aiai on the i−th(0≤i≤n−1)i−th(0≤i≤n−1) grid. ...
- 序列化表单数据$("form").serializeArray()
在做一个后台管理系统类似的项目中发现不能直接取得表单中的数值,于是想到先将表单数据转化为json,然后再用js从json中获取数据,那不就简单了吗? 于是我用了jquery的serializeArra ...
- Vue+Element实现网页版个人简历系统
这篇文章介绍一个使用Vue+Element实现的个人简历系统,主要用到的技术有:vue.element.css3.css定位. 作者在window10进行开发,目前只在chrome上进行过测试,没有大 ...
- MapReduce-自动化运行配置
1.打包时指定main Class信息 注意:默认直接通过maven插件打成jar包中没有指定main class信息,因此在运行mapreduce的jar包时必须在指令后明确main class信 ...
- 「洛谷P1196」「NOI2002」银河英雄传说 解题报告
P1196 [NOI2002]银河英雄传说 题目描述 公元五八○一年,地球居民迁至金牛座α第二行星,在那里发表银河联邦创立宣言,同年改元为宇宙历元年,并开始向银河系深处拓展. 宇宙历七九九年,银河系的 ...
- oracle mysql sql 根据一张表更新另一张表
update CDINFO.Dept_Dict tab1 set PART_FLAG = (select PART_FLAG from DICT.DEPARTMENT_DICT@zyhis4 tab2 ...
- schedule of 2016-10-09~2016-10-16(Sunday~Sunday)——1st semester of 2nd Grade
most important things to do 1.prepare for toefl 2.joint phd preparations 3.ieee trans thesis to writ ...
- axios封装的拦截器的应用
axios拦截器 页面发送http请求,很多情况我们要对请求和其响应进行特定的处理:如果请求数非常多,单独对每一个请求进行处理会变得非常麻烦,程序的优雅性也会大打折扣.好在强大的axios为开发者 ...
- VLC播放器的快捷键(shutcut)
ubuntu上的视频播放器功能简陋,不支持快慢速,于是需要一款播放器来替代它,从网上找了找,大家对VLC的评价出奇的一致, 于是试水了一下,发现功能确实强大,支持大多数多媒体文件以及各类流媒体协议 在 ...
- Scala实践8
1.1继承类 使用extends关键字,在定义中给出子类需要而超类没有的字段和方法,或者重写超类的方法. class Person { var name = "zhangsan" ...