迭代器

C++之STL迭代器

别来无恙 提交于 2020-02-17 11:26:11
迭代器是一种检查容器内元素并遍历元素的数据类型。可以替代下标访问vector对象的元素。 每种容器类型都定义了自己的迭代器类型,如 vector: vector< int>::iterator iter; 这符语句定义了一个名为 iter 的变量,它的数据类型是 vector<int> 定义的 iterator 类型。每个标准库容器类型都定义了一个名为 iterator 的成员,这里的 iterator 与迭代器实际类型的含义相同。 begin 和 end 操作 每种容器都定义了一对命名为 begin 和 end 的函数,用于返回迭代器。如果容器中有元素的话,由 begin 返回的迭代器指向第一个元素: vector< int>::iterator iter = ivec.begin(); 上述语句把 iter 初始化为由名为 vector 操作返回的值。假设 vector 不空,初始化后,iter 即指该元素为 ivec[0]。由 end 操作返回的迭代器指向 vector 的“末端元素的下一个”。表明它指向了一个不存在的元素。如果 vector 为空,begin 返回的迭代器与 end 返回的迭代器相同。由 end 操作返回的迭代器并不指向 vector 中任何实际的元素,相反,它只是起一个哨兵(sentinel)的作用,表示我们已处理完 vector 中所有元素。 【备注

STL迭代器

六月ゝ 毕业季﹏ 提交于 2020-02-16 11:21:13
迭代器 迭代器(iterator)是一种抽象的设计概念,现实程序语言中并没有直接对应于这个概念的实物。在<>一书中提供了23中设计模式的完整描述,其中iterator模式定义如下:提供一种方法,使之能够依序寻访某个容器所含的各个元素,而又无需暴露该容器的内部表示方式。迭代器的设计思维-STL的关键所在,STL的中心思想在于将容器(container)和算法(algorithms)分开,彼此独立设计,最后再一贴胶着剂将他们撮合在一起。 迭代器的种类: 输入迭代器 提供对数据的只读访问 只读,支持++、==、!= 输出迭代器 提供对数据的只写访问 只写,支持++ 前向迭代器 提供读写操作,并能向前推进迭代器 读写,支持++、==、!= 双向迭代器 提供读写操作,并能向前和向后操作 读写,支持++、–, 随机访问迭代器 提供读写操作,并能以跳跃的方式访问容器的任意数据,是功能最强的迭代器 读写,支持++、–、[n]、-n、<、<=、>、>= 举个例子: # include <iostream> # include <vector> # include <algorithm> # define _CRT_SECURE_NO_WARNINGS using namespace std ; // STL中的容器算法迭代器 void test01 ( ) { vector < int > v ;

想走? 可以! 先买票 迭代器模式

泪湿孤枕 提交于 2020-02-16 04:18:25
20.1 乘车买票 不管你是谁 20.2 迭代器模式 提供一种方法顺序访问一个聚合对象中各个元素。而又不暴露该对象的内部表示, 一个聚集对象,不管这些对象是什么都需要遍历的时候,就应该考虑用迭代器模式, 需要对聚集有多种方式遍历时,可以考虑用迭代器模式, 20.3 迭代器实现 namespace 迭代器模式 { class Program { static void Main(string[] args) { ConcreteAggregate a = new ConcreteAggregate(); //公交车,即聚集对象, a[0] = "大鸟"; a[1] = "小菜"; a[2] = "行李"; //新上来的乘客,即对象数组, a[3] = "老外"; a[4] = "公交内部员工"; a[5] = "小偷"; Iterator i = new ConcreteIterator(a); //售票员出场,看好上车的有哪些人,即声明迭代器对象, object item = i.First(); while (!i.IsDone()) { Console.WriteLine("{0} 请买车票!", i.CurrentItem()); i.Next(); } Console.Read(); } } //Iterator迭代器抽象类, abstract class Iterator

Python—迭代器和生成器

送分小仙女□ 提交于 2020-02-16 01:23:00
楔子 假如我现在有一个列表l=['a','b','c','d','e'],我想取列表中的内容,有几种方式? 首先,我可以通过索引取值l[0],其次我们是不是还可以用for循环来取值呀? 你有没有仔细思考过,用索引取值和for循环取值是有着微妙区别的。 如果用索引取值,你可以取到任意位置的值,前提是你要知道这个值在什么位置。 如果用for循环来取值,我们把每一个值都取到,不需要关心每一个值的位置,因为只能顺序的取值,并不能跳过任何一个直接去取其他位置的值。 但你有没有想过,我们为什么可以使用for循环来取值? for循环内部是怎么工作的呢? 迭代器 python中的for循环 要了解python中的for循环是怎么回事儿,咱们还是要从代码的角度出发。 首先,我们对一个列表进行for循环。 for i in [1,2,3,4]: print(i) 上面这段代码肯定是没有问题的,但是我们换一种情况,来循环一个数字1234试试 for i in 1234 print(i) 结果: Traceback (most recent call last): File "test.py", line 4, in <module> for i in 1234: TypeError: 'int' object is not iterable 看,报错了!报了什么错呢?“TypeError: 'int'

【设计模式】——迭代器模式

為{幸葍}努か 提交于 2020-02-15 23:25:37
迭代器模式(Iterator) ,提供一种方法顺序访问一个聚合对象中各个元素,而又不暴露该对象的内部表示。当你需要访问一个聚集对象,而且不管这些对象是什么都需要遍历的时候,或者你需要对聚集有多种方式遍历时,你就应该考虑用迭代器模式,为遍历不同的聚集结构提供如开始、下一个、是否结束、当前哪一项等统一接口。 #include <iostream> #include <vector> using namespace std; typedef string object; //Iterator迭代器抽象类 class Iterator { //用于定义得到开始对象、得到下一个对象、判断是否到结尾、当前对象等抽象方法 public: virtual object First()=0; virtual object Next()=0; virtual bool IsDone()=0; virtual object CurrentItem()=0; }; //Aggregate聚集抽象类 class Aggregate { public: virtual int Count() = 0; virtual void Push(const object& strValue)=0; virtual object Pop(const int nIndex)=0; virtual Iterator

迭代器模式

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

Java设计模式——迭代器模式

对着背影说爱祢 提交于 2020-02-15 18:11:09
概述 网上大部分人说迭代模式的时候,总是以某一种可遍历的对象为例进行介绍。这是可行的,这也是迭代模式的基本原型。当我看到《Head Frist设计模式》中迭代模式的时候,感觉要是能从另一个角度来说明,可能更能够体现迭代模式的威力所在。 本文介绍的这种迭代模式,倒是更像是 适配器-迭代器模式 。希望于你有益~ 版权说明 著作权归作者所有。 商业转载请联系作者获得授权,非商业转载请注明出处。 作者: Coding-Naga 发表日期: 2016年3月4日 链接: http://blog.csdn.net/lemon_tree12138/article/details/50799562 来源:CSDN 更多内容: 分类 >> 设计模式 模式说明 网上大多数关于迭代器模式的文章,讨论都是建立在一个List或是其他可迭代对象之上的。这样有一个问题,因为都是可迭代的对象,在迭代的过程中我们无法深入了解到迭代器模式能够为我们解决什么样的问题。下面有一个实例,通过这个实例可能可以说明迭代器模式的威力。 1.实例背景 有两家餐厅A和B,餐厅A是一家早餐餐厅店,而餐厅B是一家午餐餐厅店。 现在两个餐厅的大Boss决定将两家餐厅进行合并。在餐厅A中,菜单的逻辑实现是基于ArrayList的,而餐厅B的菜单逻辑实现则是基于数组的。如果去修改任何一家餐厅的菜单实现,都可能会引发一些不必要的修改

迭代器模式

允我心安 提交于 2020-02-15 18:09:22
迭代器模式   迭代器模式是指提供一种方法顺序访问一个聚合对象中的各个元素,而又不需要暴露该对象的内部表示。迭代器模式可以把迭代的过程从业务逻辑中分离出来,在使用迭代器模式之后,即使不关心对象的内部构造,也可以按顺序访问其中的每个元素。   现在流行的大部分语言如Java,Ruby等都已经有了内置的迭代器实现,许多浏览器也支持JavaScript的Array.prototype.forEach。 1. 实现自己的迭代器   现在我们来自己实现一个each函数,each函数接受2个参数,第一个为被循环的数组,第二个为循环时被触发的回调函数(接受2个参数,第1个为下标,第2个为值): var each = function (arr, callback) { for (var i = 0, l = arr.length; i < l; i++) { callback.call(arr[i], i, arr[i]); } }; each([1, 2, 3], function (i, n) { console.log(i, n);//输出:01 12 23 }); 2. 内部迭代器和外部迭代器   迭代器可以分为内部迭代器和外部迭代器,它们有各自的适用场景。这一节我们将分别讨论着两种迭代器。 1. 内部迭代器   我们刚刚编写的each函数属于内部迭代器

8、迭代器模式

最后都变了- 提交于 2020-02-15 17:56:37
一、迭代器模式概念:提供一种方法顺序访问一个聚合对象中的各个元素,而又不暴露该对象的内部表示。 二、迭代器的角色构成   (1)、迭代器角色   (2)、具体迭代器角色   (3)、容器角色   (4)、具体容器角色 三、迭代器模式的优缺点   优点:1、简化了遍历方式,对于对象集合的遍历,还是比较麻烦的,对于数组或者有序列表,我们尚可以通过游标来取得,但是用户需要在对集合了解很清楚的前提下,自行遍历对象,但是对于hash表来说,用户遍历起来就比较麻烦了,而引入了迭代器就简单的多了     2、封装性良好,用户只需要得到迭代器就可以遍历,而对于遍历算法则不用关心。     3、可以提供多种遍历方法,正序倒序都可以。   缺点:1、对于简单的遍历,使用迭代器会繁琐,像ArrayList,我们宁可使用for循环和get方法来遍历集合      四、实现 package Iterator; /** * Created by Administrator on 2018/3/3 0003. */ public interface MyList { public void add(Object object); public Object get(int index); public MyIterator iterator(); public int getSize(); } package

设计模式总体概述

社会主义新天地 提交于 2020-02-15 10:55:41
创建型模式 单例模式 定义:确保一个类只有一个实例,提供全局访问点。 目的: 使得在操纵该对象时始终只是该实例,防止资源的浪费 个人理解: 就是一个对象只能被创建一次,在定义的范围内只存在唯一的一个。从被创建到被销毁,不存在和他一样的对象。 uml图: 实现形式: public class Singleton { //volatile保证,当uniqueInstance变量被初始化成Singleton实例时,多个线程可以正确处理uniqueInstance变量 private volatile static Singleton uniqueInstance; private Singleton() { } public static Singleton getInstance() { //检查实例,如果不存在,就进入同步代码块 if (uniqueInstance == null) { //只有第一次才彻底执行这里的代码 synchronized(Singleton.class) { //进入同步代码块后,再检查一次,如果仍是null,才创建实例 if (uniqueInstance == null) { uniqueInstance = new Singleton(); } } } return uniqueInstance; } } 原型模式 定义:用一个已经创建的实例作为原型