迭代器

Head First设计模式之目录

ぐ巨炮叔叔 提交于 2020-01-14 00:52:56
一、定义 提供一种方法顺序访问一个聚合对象中各个元素, 而又无须暴露该对象的内部表示; 主要解决: 不同的方式来遍历整个整合对象。 何时使用: 遍历一个聚合对象。 如何解决: 把在元素之间游走的责任交给迭代器,而不是聚合对象。 二、结构 组成:    抽象容器 :一般是一个接口,提供一个iterator()方法,例如java中的Collection接口,List接口,Set接口等。    具体容器 :就是抽象容器的具体实现类,比如List接口的有序列表实现ArrayList,List接口的链表实现LinkList,Set接口的哈希列表的实现HashSet等。    抽象迭代器 :定义遍历元素所需要的方法,一般来说会有这么三个方法:取得第一个元素的方法first(),取得下一个元素的方法next(),判断是否遍历结束的方法hasNext(),移出当前对象的方法remove(),    迭代器实现 :实现迭代器接口中定义的方法,完成集合的迭代。 三、适用场景 1、访问一个聚合对象的内容而无须暴露它的内部表示。 2、需要为聚合对象提供多种遍历方式。 3、为遍历不同的聚合结构提供一个统一的接口。 四、优缺点 优点: 1、它支持以不同的方式遍历一个聚合对象。 2、迭代器简化了聚合类。 3、在同一个聚合上可以有多个遍历。 4、在迭代器模式中,增加新的聚合类和迭代器类都很方便,无须修改原有代码。

Python3.x和Python2.x的区别

社会主义新天地 提交于 2020-01-13 13:53:22
这个星期开始学习Python了,因为看的书都是基于Python2.x,而且我安装的是Python3.1,所以书上写的地方好多都不适用于Python3.1,特意在Google上search了一下3.x和2.x的区别。特此在自己的空间中记录一下,以备以后查找方便,也可以分享给想学习Python的friends. 1.性能 Py3.0运行 pystone benchmark的速度比Py2.5慢30%。Guido认为Py3.0有极大的优化空间,在字符串和整形操作上可 以取得很好的优化结果。 Py3.1性能比Py2.5慢15%,还有很大的提升空间。 2.编码 Py3.X源码文件默认使用utf-8编码,这就使得以下代码是合法的: >>> 中国 = 'china' >>>print(中国) china 3. 语法 1)去除了<>,全部改用!= 2)去除``,全部改用repr() 3)关键词加入as 和with,还有True,False,None 4)整型除法返回浮点数,要得到整型结果,请使用// 5)加入nonlocal语句。使用noclocal x可以直接指派外围(非全局)变量 6)去除print语句,加入print()函数实现相同的功能。同样的还有 exec语句,已经改为exec()函数 例如: 2.X: print "The answer is", 2*2 3.X: print("The

标准C++中string类及STL容器类简介

久未见 提交于 2020-01-13 12:09:13
一.标准C++库字符串类std::string的用法 #include std::string s1; std::string s3(s2); std::string s2("this is a string"); begin 得到指向字符串开头的Iterator end 得到指向字符串结尾的Iterator rbegin 得到指向反向字符串开头的Iterator rend 得到指向反向字符串结尾的Iterator size 得到字符串的大小 length() 和size函数功能相同 max_size 字符串可能的最大大小 capacity 在不重新分配内存的情况下,字符串可能的大小 empty 判断是否为空 operator[] 取第几个元素,相当于数组 c_str 取得C风格的const char* 字符串 data 取得字符串内容地址 operator= 赋值操作符 reserve 预留空间 swap 交换函数 insert 插入字符 append 追加字符 push_back 追加字符 erase 删除字符串 clear 清空字符容器中所有内容 resize 重新分配空间 assign 和赋值操作符一样 replace 替代 copy 字符串到空间 find 查找,返回基于0的索引号 rfind 反向查找 find_first_of 查找包含子串中的任何字符,返回第一个位置

Java API —— List接口&ListIterator接口

蓝咒 提交于 2020-01-13 05:18:04
1、List接口概述 有序的 collection(也称为序列)。此接口的用户可以对列表中每个元素的插入位置进行精确地控制。用户可以根据元素的整数索引(在列表中的位置)访问元素,并搜索列表中的元素。 与 set 不同,列表通常允许重复的元素。 例子1: package listdemo; import java.util.ArrayList; import java.util.Iterator; import java.util.List; /** * Created by gao on 15-12-14. */ public class ListDemo01 { public static void main(String[] args) { // 创建集合对象 List list = new ArrayList(); // 创建字符串并添加字符串 list.add("hello"); list.add("world"); list.add("java"); // 遍历集合 Iterator it = list.iterator(); while (it.hasNext()){ String s = (String)it.next(); System.out.println(s); } } } 输出结果: hello world java 例子2: package

pytorch :: Dataloader中的迭代器和生成器应用

青春壹個敷衍的年華 提交于 2020-01-13 03:43:31
在使用pytorch训练模型,经常需要加载大量图片数据,因此pytorch提供了好用的数据加载工具Dataloader。 为了实现小批量循环读取大型数据集,在Dataloader类具体实现中,使用了迭代器和生成器。 这一应用场景正是python中迭代器模式的意义所在,因此本文对Dataloader中代码进行解读,可以更好的理解python中迭代器和生成器的概念。 本文的内容主要有: 解释python中的迭代器和生成器概念 解读pytorch中Dataloader代码,如何使用迭代器和生成器实现数据加载 python迭代基础 python中围绕着迭代有以下概念: 可迭代对象 iterables 迭代器 iterator 生成器 generator 这三个概念互相关联,并非孤立。在可迭代对象的基础上发展了迭代器,在迭代器的基础上又发展了生成器。 学习这些概念的名词解释没有多大意义。编程中很多的抽象概念都是为了更好的实现某些功能,才去人为创造的协议和模式。 因此,要理解它们,需要探究概念背后的逻辑,为什么这样设计?要解决的真正问题是什么?在哪些场景下应用是最好的? 迭代模式首先要解决的基础问题是,需要按一定顺序获取集合内部数据,比如循环某个list。 当数据很小时,不会有问题。但当读取大量数据时,一次性读取会超出内存限制,因此想出以下方法: 把大的数据分成几个小块,分批处理

大话设计模式之迭代器模式

假装没事ソ 提交于 2020-01-12 20:49:24
迭代器模式   提供一种方法顺序访问一个聚合对象中的各个元素,而又不暴露对象的内部表示。 迭代器模式的角色构成 (1)迭代器角色(Iterator):定义遍历元素所需要的方法,一般来说会有这么三个方法:取得下一个元素的方法next(),判断是否遍历结束的方法hasNext()),移出当前对象的方法remove(), (2)具体迭代器角色(Concrete Iterator):实现迭代器接口中定义的方法,完成集合的迭代。 (3)容器角色(Aggregate): 一般是一个接口,提供一个iterator()方法,例如java中的Collection接口,List接口,Set接口等 (4)具体容器角色(ConcreteAggregate):就是抽象容器的具体实现类,比如List接口的有序列表实现ArrayList,List接口的链表实现LinkList,Set接口的哈希列表的实现HashSet等。 模拟迭代器实现 创建迭代器角色 /** * @Author: chen * @Description: 定义抽象迭代器 * @Date: created in 2018/8/20 * @Modified By: */ public interface MyIterator { Boolean hasNext(); Object next(); }   自定一个聚集类; 在聚集类内部

迭代器模式(Iterator Pattern)

故事扮演 提交于 2020-01-12 11:29:22
模式动机: 1 、一个聚合对象,如一个列表 (List) 或者一个集合 (Set) ,应该提供一种方法来让别人可以访问它的元素,而又不需要暴露它的内部结构。 2 、针对不同的需要,可能还要以不同的方式遍历整个聚合对象,但是我们并不希望在聚合对象的抽象层接口中充斥着各种不同遍历的操作。 3 、怎样遍历一个聚合对象,又不需要了解聚合对象的内部结构,还能够提供多种不同的遍历方式,这就是迭代器模式所要解决的问题。 4 、在迭代器模式中, 提供一个外部的迭代器来对聚合对象进行访问和遍历,迭代器定义了一个访问该聚合元素的接口,并且可以跟踪当前遍历的元素,了解哪些元素已经遍历过而哪些没有。 5 、有了迭代器模式,我们会发现对一个复杂的聚合对象的操作会变得如此简单。 模式意图: 迭代器模式 (Iterator Pattern) :提供一种方法来访问聚合对象,而不用暴露这个对象的内部表示,其别名为游标 (Cursor) 。迭代器模式是一种对象行为型模式。 UML 图: 角色: Iterator: 抽象迭代器定义了访问和遍历元素的接口。 ConcreteIterator: 具体迭代器实现了抽象迭代器接口,完成对聚合对象的遍历。 Aggregate: 抽象聚合类用于存储对象,并定义创建相应迭代器对象的接口。 ConcreteAggregate: 具体聚合类实现了创建相应迭代器的接口。 模式分析: 1

python-迭代器模式

风流意气都作罢 提交于 2020-01-12 09:09:53
源码地址: https://github.com/weilanhanf/PythonDesignPatterns 说明: 集合是用来管理和组织数据对象的数据结构的。集合有两项基本职能:一、批量的存储数据对象,二、在不暴露集合内部结构的条件下向外界提供访问内部元素的接口(可能存在的遍历方式:顺序、逆序遍历,二叉树的广度优先,先序后序中序遍历等)。要使得集合保持整洁和优雅,而不是说令集合内部包含着各种遍历的方法。因此要求将遍历的方法从集合的指责中分离出来,按照不同的遍历需求分别封装成一个个专门遍历集合内部数据的迭代器。这种思想可以最大限度的减少彼此之间的耦合程度,从而建立一个松散耦合的对象网络。职责分离的要点就是要对分离的职责进行封装,并以抽象对象的方式建立彼此之间的关系。 迭代器模式:提供一种方法顺序访问一个聚合对象中各个元素,且不用暴露该对象的内部表示 聚合对象的两个职责: 存储数据,聚合对象的基本职责 遍历数据,既是可变化的,又是可分离的。将遍历数据的行为从聚合对象中分离出来,封装在迭代器对象中。由迭代器来提供遍历聚合对象内部数据的行为,简化聚合对象的设计,更符合单一职责原则。 迭代器模式包含以下4个角色: Iterator(抽象迭代器) ConcreteIterator(具体迭代器) Aggregate(抽象聚合类) ConcreteAggregate(具体聚合类) 实例:

Standard C++ Episode 11

こ雲淡風輕ζ 提交于 2020-01-12 07:11:23
一、标准模板库(STL) (p.s. STL中的常用实用工具 auto_ptr string pair ) 1.定义了一系列的容器模板(类模板),实现泛型化的数据结构。 1)向量(vector, 这里说的"向量"就是数组), 向量内存连续,支持下标访问和随机迭代,只有在尾部进行插入和删除效率才比较高。 2)列表(list),内存不连续,不支持下标访问和随机迭代,在任何位置进行插入和删除效率都很高。 3)双端队列(deque),内存连续,支持下标访问和随机迭代,在首尾两端进行插入和删除效率都比较高。 以上三种合称为线性容器。 4)堆栈(stack),后进先出 5)队列(queue),先进先出 6)优先队列(priority_queue),优者先出 以上三种合称为适配器容器,通过某种线性容器适配。 7)映射(map),是键值对(KVP)的集合,按键升序,键唯一。 采用了有序二叉树(二叉搜索树)数据结构实现。 8)集合(set),没有值只有键的映射, 按键升序。 9)多重映射(multimap),允许重复键的映射,即键不唯一。按键升序。 10)多重集合(multiset),没有值只有键的多重映射。按键升序。 以上四种合称为关联容器。通过有序树表达数据的关联性。按键升序。 2.泛型函数(函数模板) template<typename T> void swap (T& a, T& b) {

迭代器模式

若如初见. 提交于 2020-01-12 04:40:46
迭代器模式的定义 迭代器模式( Iterator Pattern)目前已经是一个没落的模式,基本上没人会单独写一个迭 代器,除非是产品性质的开发,其定义如下: Provide a way to access the elements of an aggregate object sequentially without exposing it sunderlying representation.(它提供一种方法访问一个容器对象中各个元素,而又不需暴露该 对象的内部细节。) 迭代器是为容器服务的,那什么是容器呢? 能容纳对象的所有类型都可以称之为容 器,例如 Collection集合类型、Set类型等,迭代器模式就是为解决遍历这些容器中的元素而 诞生的。 迭代器模式提供了遍历容器的方便性,容器只要管理增减元素就可以了,需要遍历时交 由迭代器进行。 迭代器 模式中的各个角色: ● Iterator抽象迭代器 抽象迭代器负责定义访问和遍历元素的接口,而且基本上是有固定的 3个方法:first()获 得第一个元素, next()访问下一个元素,isDone()是否已经访问到底部(Java叫做hasNext()方 法)。 ● ConcreteIterator具体迭代器 具体迭代器角色要实现迭代器接口,完成容器元素的遍历。 ● Aggregate抽象容器