迭代器

STL笔记

非 Y 不嫁゛ 提交于 2020-01-10 19:05:50
STL的基本概念:   1-容器:是可容纳各种类型的数据结构,是 类模板 。   2-迭代器:是用于依次存放容器中的元素,类似 指针 。   3-算法: 是用于操作容器中元素的 函数模板 。        sort() 用来对 vector 中的数据进行排序。        find() 用来搜索 list 中的对象。       算法本身与他们操作的数据类型无关,因此他们可以在从简单数组到高度复杂容器的任何数据结构上使用。 如 int a[100]:   该数组就是容器,而int * 类型的指针变量就可以作为迭代器,sort算法可以作用在该容器上,对其排序:   sort(a,a+50); //对前50个元素进行排序 容器种类:   顺序容器: vector(数组) ,deque (双向队列),list(双向链表)   关联容器:set ,multiset ,map ,multimap // 都能对输入数据进行排序   容器适配器: stack ,queue ,priority_queue   PS: 对象被插入容器中时,被插入的是对象的一个 复制品 。 容器 容器上的迭代器访问 vector 随机访问(通过下标就能取到元素) deque 随机访问 list 双向(不能用下标取元素) set/multiset 双向 map/multimap 双向 stack 不支持迭代器

迭代器 Iterator

懵懂的女人 提交于 2020-01-10 13:38:33
迭代器 Iterator 凡是可作用于 for 循环的对象都是 Iterable 类型; 凡是可作用于 next() 函数的对象都是 Iterator 类型,它们表示一个惰性计算的序列; 集合数据类型如 list 、 dict 、 str 等是 Iterable 但不是 Iterator ,不过可以通过 iter() 函数获得一个 Iterator 对象。 Python的 for 循环本质上就是通过不断调用 next() 函数实现的,例如下面两个完全等价: for x in [1, 2, 3, 4, 5]: pass # 首先获得Iterator对象: it = iter([1, 2, 3, 4, 5]) # 循环: while True: try: # 获得下一个值: x = next(it) except StopIteration: # 遇到StopIteration就退出循环 break 来源: CSDN 作者: zang1206 链接: https://blog.csdn.net/zang1206/article/details/103922651

Iterator和ListIterator关系

烂漫一生 提交于 2020-01-10 12:38:41
一.相同点 都是迭代器,当需要对集合中元素进行遍历不需要干涉其遍历过程时,这两种迭代器都可以使用。 二.不同点 1.使用范围不同,Iterator可以应用于所有的集合,Set、List和Map和这些集合的子类型。而ListIterator只能用于List及其子类型。 2.ListIterator有add方法,可以向List中添加对象,而Iterator不能。 3.ListIterator和Iterator都有hasNext()和next()方法,可以实现顺序向后遍历,但是ListIterator有hasPrevious()和previous()方法,可以实现逆向(顺序向前)遍历。Iterator不可以。 4.ListIterator可以定位当前索引的位置,nextIndex()和previousIndex()可以实现。Iterator没有此功能。 5.都可实现删除操作,但是ListIterator可以实现对象的修改,set()方法可以实现。Iterator仅能遍历,不能修改。 方法详细信息 hasNext boolean hasNext() 以正向遍历列表时,如果列表迭代器有多个元素,则返回 true (换句话说,如果 next 返回一个元素而不是抛出异常,则返回 true )。 指定者: 接口 Iterator < E > 中的 hasNext 返回: 如果以正向遍历列表

java集合

空扰寡人 提交于 2020-01-10 10:22:43
转自:http://www.cnblogs.com/ysocean/p/6555373.html 一、集合的由来   通常,我们的程序需要根据程序运行时才知道创建多少个对象。但若非程序运行,程序开发阶段,我们根本不知道到底需要多少个数量的对象,甚至不知道它的准确类型。为了满足这些常规的编程需要,我们要求能在任何时候,任何地点创建任意数量的对象,而这些对象用什么来容纳呢?我们首先想到了数组,但是数组只能放统一类型的数据,而且其长度是固定的,那怎么办呢?集合便应运而生了! 为了对集合有个更加深入的了解,可以看我的这一篇文章: 用 Java 数组来实现 ArrayList 集合 http://www.cnblogs.com/ysocean/p/6812674.html 二、集合是什么?   Java集合类存放于 java.util 包中,是一个用来存放对象的容器。 注意:①、集合只能存放对象。比如你存一个 int 型数据 1放入集合中,其实它是自动转换成 Integer 类后存入的,Java中每一种基本类型都有对应的引用类型。    ②、集合存放的是多个对象的引用,对象本身还是放在堆内存中。    ③、集合可以存放不同类型,不限数量的数据类型。 三、Java 集合框架图 此图来源于: http://blog.csdn.net/u010887744/article/details

迭代器模式

南楼画角 提交于 2020-01-10 00:31:25
迭代器模式遍历集合的成熟模式,迭代器模式的关键是将遍历集合的任务交给一个叫做迭代器的对象,它的工作时遍历并选择序列中的对象,而客户端程序员不必知道或关心该集合序列底层的结构。   迭代器模式的结构中包括四种角色。   一、集合:一个接口,规定了具体集合需要实现的操作。   二、具体集合:具体集合石实现了集合接口的一个实例,具体的集合按照一定的结构存储对象。具体集合应该有一个方法,该方法返回一个针对该集合的具体迭代器。   三、迭代器:一个接口,规定了遍历具体集合的方法,比如next()方法。   四、具体迭代器:实现了迭代器接口的类的实例。具体迭代器在实现迭代器接口所规定的遍历集合的方法时,比如next()方法,要保证首次调用将按着集合的数据结构找到该集合的一个对象,并且每当找到集合中的一个对象,立即根据该集合的存储结构得到待遍历的后继对象的引用,并保证一次调用next()方法可以遍历集合。   下列应用程序中,使用了迭代器模式中所涉及的类。该应用程序模拟点钞,使用HashSet类的实例,即一个集合模拟保险箱HashSet类的实例调用iterator()方法返回一个迭代器,用该迭代器模拟点钞机,而且在点钞过程中销毁假钞。 1 package com.iterator; 2 3 import java.util.Collection; 4 import java.util

《C++ Primer Plus》第16章 string类和标准模板库 学习笔记

笑着哭i 提交于 2020-01-09 21:23:02
C++提供了一组功能强大的库,这些库提供了很多常见编程问题的解决方案以及简化其他问题的工具string类为将字符串作为对象来处理提供了一种方便的方法。string类提供了自动内存管理动能以及众多处理字符串的方法和函数。例如,这些方法和函数让您能够合并字符串、将一个字符串插入到另一个字符串中、反转字符串、在字符串中搜索字符或姊姊富川以及执行输入和输出操作。 诸如auto_ptr以及C++11新增的shared_ptr和unique_ptr等智能指针模板使得管理由new分配的内存更容易。如果使用这些智能指针(而不是常规指针)来保存new返回的地址,则不比在以后使用删除运算符。智能指针对象过期时,其析构函数将自动调用delete运算符。 STL是一个容器类模板、迭代器类模板、函数对象模板和算法函数模板的集合,它们的设计是一致的,都是基于泛型编程原则的。算法通过使用模板,从而独立于所存储的对象的类型;通过使用迭代器接口,从而独立于容器的类型。迭代器是广义指针。 STL使用术语“概念”來描述一组要求。例如,正向迭代器的概念包含这样的要求,即正向迭代器能 够被解除引用,以便读写,问时能够被递增。概念真正的实现方式被称为概念的“模型”例如,正向迭代器概念可以是常规指针或导航链表的对象。基于其他概念的概念叫作“改进”例如,双向迭代器是正向迭代器概念的改进。

《C++ Primer Plus》16.4 泛型编程 学习笔记

▼魔方 西西 提交于 2020-01-09 21:10:35
STL是一种泛型编程(generic programming)。面向对象编程关注的是编成的数据方面,而泛型编程关注的是算法。它们之间的共同点是抽象和创建可重用代码,单他们的理念决然不同。 泛型编程旨在编写独立于数据类型的代码。 16.4.1 为何使用迭代器 理解迭代器是理解STL的关键所在。模板使得算法独立于存储的数据类型,而迭代其使算法独立于使用的容器类型。因此,它们都是STL通用方法的重要组成部分。 为了解为何需要迭代器,我们来看如何为两种不同数据表现实现find函数,然后来看如何推广这种方法。首先来看一个在double数组中搜索特定值的函数,可以这样编写该函数: double * find_ar(double * ar, int n, const double & val) { for (int i = 0; i < n; i ++) if (ar[i] == val) return &ar[i]; return 0; // or, in C++11, return nullptr; } 如果函数在数组中找到这样的值,则返回该值在数组中的地址,否则返回一个空指针。该函数使用下标来便利数组。可以用模板将这种算法推广到包含==运算符的、任意类型的数组。尽管这样,这种算法仍然与一种特定的数据结构(数组)关联在一起。 下面来看搜索另一种数据结构——链表的情况

Iterator迭代器

自作多情 提交于 2020-01-07 21:49:28
集合的继承关系: Iterator迭代器是一个接口,无法直接使用,需要使用Iterator接口的实现类对象,获取该类的方法比较特殊 package Exercise; import java.util.ArrayList; import java.util.Collection; import java.util.Iterator; /** * 2020/1/7 * java.util.Iterator接口:迭代器(对集合元素进行遍历) * E next 取出集合中的下一个元素 * boolean hasNext()判断集合中还有没有下一个元素 * Iterator迭代器是一个接口,无法直接使用,需要使用Iterator接口的实现类对象,获取该类的方法比较特殊 * Collection接口中有一个方法叫iterator(),返回的就是迭代器的实现类对象Iterator<E> iterator * * 迭代器的使用步骤: * 1.使用集合中的方法iterator()获取迭代器的实现类对象,使用iterator接口接收(多态) * 2.hasNext()方法判断 * 3.next()方法取出集合中的下一个元素 */ public class IteratorExample { public static void main(String[] args) { Collection

python的生成器和迭代器

社会主义新天地 提交于 2020-01-07 18:37:42
一.迭代器 迭代器指的是迭代取值的工具,迭代是指一个重复的过程,每一次重复都是基于上一次结果而来   迭代提供了一种通用的不依赖索引的迭代取值方式   一.可迭代对象     但凡内置有__iter__方法的对象,都称为可迭代对象,可迭代的对象:str,list,tuple,dict,set,文件对象   二.迭代器对象     1既内置又__next__方法的对象,执行该方法可以不依赖索引取值     2.又内置有__iter__方法的对象,执行迭代器的__iter__方法得到的依然是迭代器本身     迭代器一定是可迭代对象,可迭代对象不一定是迭代器对象,文件对象本身就是一个迭代器对象   例如:执行可迭代对象下的__iter__方法,返回一个迭代器对象,在通过迭代器对象的__next__方法取值,如果取值次数超过源值的数量就会报错 执行结果: for循环本质为迭代器循环   工作原理:     1.先调用in后对象的__iter__方法,将其变成一个迭代器对象     2.调用next(迭代器),将得到的返回值赋值给变量名     3.循环往复直到next(迭代器)抛出异常,for会自动捕捉异常然后结束循环   ps:可以从for的角度,分辨但凡可以被for循环取值的对象就是可迭代对象   迭代器优点:     1.提供了一种通用不依赖索引的迭代取值方式     2

GOF 23设计模式之(行为型模式二)

北城以北 提交于 2020-01-07 12:41:54
目录 1.中介者模式 2.迭代器模式 3.访问者模式 4.备忘录模式 5.解析器模式 一、中介者模式(Mediator)   定义一个中介对象来封装一系列对象之间的交互,使原有对象之间的耦合松散,可以独立地改变他们之间的交互。又叫调停模式,是迪米特法则的典型应用。      核心角色:   (1)抽象中介者角色(Mediator):提供同事对象注册与转发同事对象信息的抽象方法。   (2)具体中介者角色(Concrete Mediator):实现中介者接口,定义一个List来管理同事对象,协调各个同事角色之间的交互关系,因此依赖于同事角色。   (3)抽象同事类角色(Colleague):定义同事类的接口,保存中介者对象,提供同事对象交互的抽象方法,实现所有相互影响的同事类的公共功能。   (4)具体同事类角色(Concrete Colleague):抽象同事类的实现者,当需要与其他同事对象交互时,由中介者对象负责后续的交互。   优点:   (1)降低对象之间的耦合性,使得对象易于独立地被复用。   (2)将对象间的一对多关联,转变为一对一的关联,提高系统的灵活性。      缺点:   (1)当同事类太多,中介者的职责将很大,会变得复杂而庞大,系统难于维护。    public class textMediator { public static void main