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的循环语法,从其中依次取出数据,这个过程叫做 ...
随机推荐
- destoon信息或者公司归属多个类别的解决方式
有时候,一条信息属对应于多个类别,在destoon原生系统里是没有这个解决方案 在公司行业类别选择的地方实现了这个功能,但是选择体验不太好,不符合我当前的需求,目前我写了如下解决方案 系统代码如下: ...
- python 给三个数字排序,不用sort函数
# 给三个数字排序# 方法一def sort_d(a,b,c): if a>b: a,b=b,a # print (a,b) if b>c: b,c=c,b if a>b: a,b= ...
- tcp短连接和长连接
1. TCP连接 当网络通信时采用TCP协议时,在真正的读写操作之前,server与client之间必须建立一个连接,当读写操作完成后,双方不再需要这个连接时它们可以释放这个连接,连接的建立是需要三次 ...
- 【软帝学院】女生不适合学习java?其实女生学java更有优势,更好就业!
女生适合学java吗?女生做IT怎么样 首先要表明我的观点,编程是不分男女,什么女生不适合学编程的说法,从客观上来说,我觉得这是一种偏见. 不少人潜意识里认为女生不适合从事IT开发岗位的工作,因为他们 ...
- 0016 CSS 背景:background
目标 理解 背景的作用 css背景图片和插入图片的区别 应用 通过css背景属性,给页面元素添加背景样式 能设置不同的背景图片位置 [插入图片,不用设置img元素的父元素.自身元素大小,即可见,但是背 ...
- 突破CRUD | 简单优雅的代码生成工具诞生记(万字长文慎入)
0.学习本文你或许可以收获 1.一个需求从产生.分析到解决的全过程思考2.简单的面向对象分析实践3.UML类图实践4.设计模式的实践应用5.最后收获一款还算不错的代码生成工具实现思路和源代码 本文将从 ...
- 前端Tips#3 - 简写的 border-radius 100% 和 50% 是等效的
本文同步自 JSCON简时空 - 技术博客,点击阅读 视频讲解 视频地址 文字讲解 1.先讲结论 border-radius 这个 css 属性大家应该使用得非常娴熟,现实中用到的场景基本都是四个圆角 ...
- [转载] Windows系统批处理延迟方法
小贴士:方法四 亲测有效,因为当时对于精确度要求不是很高,所以没有具体测试它的精确度.其他方法没有测过,用到的时候再测吧! 批处理延时启动的几个方法 方法一:ping 缺点:时间精度为1秒,不够精确 ...
- mock造数据
前端开发,需要和后台联调:很多时候,前端开发并不需要等后台完全写好接口在去联调,自己可以写死数据,渲染数据,加样式.后台人员有时会很忙,他没有时间写好返回所有的数据等等,特别是新开一个项目,从零开始的 ...
- Scanner使用方法
import java.util.Scanner; //导入包 public void main (String args[]){ Scanner a=new Scanner(System.in); ...