迭代器

STL简介(Introduction to the Standard Template Library)

邮差的信 提交于 2020-04-08 00:56:54
昨天晚上花了一个晚上,翻译了一篇关于STL的文章。呵呵,第一次翻译这种东西,感觉计算机书籍还是英文原版的比较好,因为很多概念没法用中文恰当的表示(简直就是只可意会不可言传啊,:-))。由于第一次翻译,呵呵,水平肯定比较菜了,关键是对STL以前没看过,比较陌生,所以翻译得很辛苦。还是看英文原版的好,翻译的太辛苦了。 STL简介(Introduction to the Standard Template Library) gshine 译 STL(标准模板库,Standard Template Library),是一个包含容器(container)类,算法(algorithm)和迭代器(iterators)的C++类库。它提供了许多计算机科学方面的基本算法和数据结构。STL是一个泛型(generic)库,这意味着它的各个组件(components)都已经最大程度的参数化了,基本上STL里面的所有组件都是一个模板(template)。所以,在你使用STL之前,必须保证你已经理解了C++中模板(template)是如何工作的。 容器和算法(container and algorithm) 和大多数类库一样,STL也包含容器类—它的主要目的是容纳其他的对象(通常是多个)。这些容器类包括以下几个类(classes):vector,list,deque,set,multiset,map

设计模式-迭代器模式

守給你的承諾、 提交于 2020-04-07 09:56:35
迭代器模式是数据访问遍历的一种行为模式。java中List、Set、Map 等都包含了迭代器。迭代器提供一个对象来顺序访问聚合对象中的一系列数据,而不暴露聚合对象的内部表示。迭代器模式的优点: 无须暴露聚合对象的内部表示 遍历任务交由迭代器完成,简化聚合类 遍历的方式可扩展 模式结构 迭代器模式主要包含以下角色。 抽象聚合(Aggregate)角色:定义存储、添加、删除聚合对象以及创建迭代器对象的接口。 具体聚合(ConcreteAggregate)角色:实现抽象聚合类,返回一个具体迭代器的实例。 抽象迭代器(Iterator)角色:定义访问和遍历聚合元素的接口,通常包含 hasNext()、first()、next() 等方法。 具体迭代器(Concretelterator)角色:实现抽象迭代器接口中所定义的方法,完成对聚合对象的遍历,记录遍历的当前位置。 源码导读 集合类的迭代器我们没少用,我们来看看它的相关源码吧,以 ArrayList 为例,它就是一个collection的具体聚合,其方法 iterator() 便是获取迭代器的方法: public Iterator<E> iterator() { return new Itr(); } z这个 Itr 是它的内部类: private class Itr implements Iterator<E> { int cursor

设计模式-迭代器模式

丶灬走出姿态 提交于 2020-04-07 09:42:05
迭代器模式是数据访问遍历的一种行为模式。java中List、Set、Map 等都包含了迭代器。迭代器提供一个对象来顺序访问聚合对象中的一系列数据,而不暴露聚合对象的内部表示。迭代器模式的优点: 无须暴露聚合对象的内部表示 遍历任务交由迭代器完成,简化聚合类 遍历的方式可扩展 模式结构 迭代器模式主要包含以下角色。 抽象聚合(Aggregate)角色:定义存储、添加、删除聚合对象以及创建迭代器对象的接口。 具体聚合(ConcreteAggregate)角色:实现抽象聚合类,返回一个具体迭代器的实例。 抽象迭代器(Iterator)角色:定义访问和遍历聚合元素的接口,通常包含 hasNext()、first()、next() 等方法。 具体迭代器(Concretelterator)角色:实现抽象迭代器接口中所定义的方法,完成对聚合对象的遍历,记录遍历的当前位置。 源码导读 集合类的迭代器我们没少用,我们来看看它的相关源码吧,以 ArrayList 为例,它就是一个collection的具体聚合,其方法 iterator() 便是获取迭代器的方法: public Iterator<E> iterator() { return new Itr(); } z这个 Itr 是它的内部类: private class Itr implements Iterator<E> { int cursor

行为型模式:迭代器模式

牧云@^-^@ 提交于 2020-04-06 07:45:27
LieBrother原文 : 行为型模式:迭代器模式 十一大行为型模式之六:迭代器模式。 简介 姓名 :迭代器模式 英文名 :Iterator Pattern 价值观 :人生没有回头路 个人介绍 : Provide a way to access the elements of an aggregate object sequentially without exposing its underlying representation. 它提供一种方法访问一个容器对象中各个元素,而又不需暴露该对象的内部细节。 (来自《设计模式之禅》) 你要的故事 大家伙听歌频率高么?是不是经常听歌曲来放松心情?我是经常会听歌,心情不好的时候听歌,心情好的时候也听歌。。。今天讲的迭代器模式,我们就拿听歌这件事来说说,大家都知道听歌有几种模式:单曲循环、列表循环、随机等等。。。现在网易云音乐还多了一个心动模式。 既然说到迭代器模式,那这里就要着重讲讲列表循环这个听歌模式,其他的就先抛到脑后。在列表循环中,歌曲从第一条播放到最后一条,也就是一个遍历歌单的过程。我们有 2 种实现方式,一种是没有迭代器,通过获取歌单,用 for 循环遍历每一个歌曲,然后播放;另外一种是使用迭代器,获取歌单的一个迭代器,通过迭代器来遍历每一个歌曲,然后播放。下面我们就用代码来实现这 2 种方式。 木有迭代器 public

for...of循环

亡梦爱人 提交于 2020-04-06 06:45:53
for of 循环语句 for...of 循环语句 ES6 为实现了迭代器接口的数据提供了统一访问访机制:新增了一个循环语句 — for...of 循环语句;该语句会自动寻找 Iterator 接口。所以数据只要实现了 Iterator 接口,该数据就是可以被遍历的;该接口默认部署在 Symbol.iterator 属性上 原生的数据实现了迭代器接口的有: Array , String , Map , Set , TypedArray (如 Int8Array ), arguments , NodeList , HTMLCollection 等 // 字符串迭代器接口 console.log(String.prototype[Symbol.iterator]) //类数组 迭代器 let arr = new Int8Array(4) arr[0] = 10 arr[1] = 100 // arr[2] = 1000 arr[2] = 2 ** 7 - 1 console.log(arr) //参数 function demo() { console.log(arguments) } demo() console.log(document.getElementsByTagName('div')); console.log(document.querySelectorAll('div'

java 集合框架迭代器

谁说我不能喝 提交于 2020-04-05 16:55:26
迭代器是集合取出元素的方式。 把取出方式定义在集合的内部,这样取出方式就可以直接访问集合内容的元素,那么取出方式就被定义成了内部类,而每一个容器的数据结构不同,所以取出的动作细节也不一样,但是都有共性内容判断和取出。可以将这些共性抽取。这些内部类都符合一个规则,该规则是Iterator,这个取出对象的获取方法:iterator(); public static void main(String[] args) { ArrayList al1 = new ArrayList(); al1.add("java01"); al1.add("java02"); al1.add("java03"); al1.add("java04"); Iterator it = al1.iterator();//获取迭代器,用于取出集合中的元素 while (it.hasNext()) { System.out.println(it.next()); } } public static void main(String[] args) { ArrayList al1 = new ArrayList(); al1.add("java01"); al1.add("java02"); al1.add("java03"); al1.add("java04"); for (Iterator it = al1

对<Effective Python: 编写高质量Python代码的59个有效方法>中知识点的总结和扩展

与世无争的帅哥 提交于 2020-04-04 16:50:59
对<Effective Python: 编写高质量Python代码的59个有效方法>中知识点的总结和扩展 《Effective Python》一书结合Python的语言特性,对代码规范进行了详细总结,是一本非常不错的Python实操指南。但我在阅读的过程中发现有些地方仅仅是告知读者“怎么做”,但是具体“为什么”不是很深入。下面内容是我对这些知识点的总结和相应原理的扩展。 (如有不准确之处欢迎指正) Python版本问题,略。 关于PEP8:这是Python代码风格的一些规范,感兴趣的同学可以自行了解。 在Python3中,bytes和str是两种截然不同的类型: bytes是计算机原始的二进制格式,而str是包含Unicode字符的,开发者不能以+号之类的操作符直接对它们两个进行混合操作。 实际上,它们互相之间是编码(encode)与解码(decode)的关系。 >>> s = "哇哈" >>> b = bytes(s,encoding="utf-8") # encode >>> print(s) 哇哈 >>> print(b) b'\xe5\x93\x87\xe5\x93\x88' 可以看到,s是str类型,返回的依旧是人类能懂的文字,而b则返回的实际上是6个16进制,每一个代表一字节。 注意,在bytes函数中使用了encoding参数并且赋值"utf-8"。为什么呢

迭代器和生成器

一曲冷凌霜 提交于 2020-04-04 06:57:31
一、手动访问迭代器中的元素   要手动访问可迭代对象中的元素,可以使用next()函数。 with open('/etc/passwd') as f: try: while True: line = next(f) print(line, end='') except StopIteration: pass with open('/etc/passwd') as f: while True: line = next(f,None) if line is None: break print(line, end='') 二、委托迭代   Python的迭代协议要求__iter__()返回一个特殊的迭代器对象,由该对象实现的__next__()方法来完成实际的迭代。   如果要做的只是迭代另一个容器中的内容,我们不必担心底层细节是如何工作的,所要做的就是转发迭代请求。 class Node: def __init__(self,value): self._value = value self._children = [] def __repr__(self): return 'Node({!r})'.format(self._value) def add_children(self,node): self._children.append(node) def __iter__(self)

Python高级特性:迭代器和生成器

一个人想着一个人 提交于 2020-04-01 07:48:54
在Python中,很多对象都是可以通过for语句来直接遍历的,例如list、string、dict等等,这些对象都可以被称为可迭代对象。至于说哪些对象是可以被迭代访问的,就要了解一下迭代器相关的知识了。 迭代器 迭代器对象要求支持迭代器协议的对象,在Python中,支持迭代器协议就是实现对象的__iter__()和next()方法。其中__iter__()方法返回迭代器对象本身;next()方法返回容器的下一个元素,在结尾时引发StopIteration异常。 __iter__()和next()方法 这两个方法是迭代器最基本的方法,一个用来获得迭代器对象,一个用来获取容器中的下一个元素。 对于可迭代对象,可以使用内建函数iter()来获取它的迭代器对象: 例子中,通过iter()方法获得了list的迭代器对象,然后就可以通过next()方法来访问list中的元素了。当容器中没有可访问的元素后,next()方法将会抛出一个StopIteration异常终止迭代器。 其实,当我们使用for语句的时候,for语句就会自动的通过__iter__()方法来获得迭代器对象,并且通过next()方法来获取下一个元素。 自定义迭代器 了解了迭代器协议之后,就可以自定义迭代器了。 下面例子中实现了一个MyRange的类型,这个类型中实现了__iter__()方法

设计模式之迭代器模式(Iterator)详解及代码示例

扶醉桌前 提交于 2020-04-01 06:03:03
一、模式的定义与特点   迭代器(Iterator)模式的定义:迭代器模式是一种对象行为型模式,提供一个对象来顺序访问聚合对象中的一系列数据,而不暴露聚合对象的内部表示。 二、迭代器模式优缺点   其主要优点如下: 访问一个聚合对象的内容而无须暴露它的内部表示。 遍历任务交由迭代器完成,这简化了聚合类。 它支持以不同方式遍历一个聚合,甚至可以自定义迭代器的子类以支持新的遍历。 增加新的聚合类和迭代器类都很方便,无须修改原有代码。 封装性良好,为遍历不同的聚合结构提供一个统一的接口。   其主要缺点是: 增加了类的个数,这在一定程度上增加了系统的复杂性。 三、迭代器模式的实现   迭代器模式是通过将聚合对象的遍历行为分离出来,抽象成迭代器类来实现的,其目的是在不暴露聚合对象的内部结构的情况下,让外部代码透明地访问聚合的内部数据。现在我们来分析其基本结构与实现方法。   迭代器模式主要包含以下角色。 抽象聚合(Aggregate)角色:定义存储、添加、删除聚合对象以及创建迭代器对象的接口。 具体聚合(ConcreteAggregate)角色:实现抽象聚合类,返回一个具体迭代器的实例。 抽象迭代器(Iterator)角色:定义访问和遍历聚合元素的接口,通常包含 hasNext()、first()、next() 等方法。 具体迭代器(Concretelterator)角色