迭代器

设计模式之迭代器模式

自古美人都是妖i 提交于 2020-02-21 11:30:14
迭代器模式概念: 迭代器模式提供一种方法顺序访问一个聚合对象中各个元素,而不需要暴露该方法中的内部表示 jquery中我们经常会用到的一个each函数就是迭代器模式。 迭代器模式的作用: 1.为了遍历不同的集合结构提供一个统一的接口,从而支持同样的算法在不同的集合结构上进行操作。 2.对于集合内部结构常常变化各异,我们不想暴露其内部结构的话,但有不想让客户代码透明的访问其中的 元素,这种情况下我们可以使用迭代器模式 注意事项 1.一般的迭代,我们至少要有2个方法,hasNext()和next(),这样才能做到遍历所有对象 2.遍历的同事更改迭代器所有的集合结构可能会导致问题(比如c#的forEach里不允许修改item) <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <meta name="viewport" content="width=device-width, initial-scale=1.0"> <meta http-equiv="X-UA-Compatible" content="ie=edge"> <title>Document</title> </head> <body> <script> var arr = ['test','2','3']; var diedai = (

【C++ STL】List

安稳与你 提交于 2020-02-21 10:07:11
1、结构   list使用一个double linked list(双向链表)来管理元素。 2、 list 能力   list内部结构和vector或deque截然不同,所以与他们的区别:   list不支持随机存取,需要存取某个元素,需要遍历之前所有的元素,是很缓慢的行为。   任何位置上(不止是两端)安插和删除元素都非常快,始终都是在常数时间内完成,因为无需移动其他任何操作,实际上只进行了一些指针操作。   安插和删除并不会造成指向其他元素的各个pointers、reference、iterators失效   list是原子操作,要么成功,要么失败,不会说只执行一半。   list不支持随机存取,不提供下标操作符和at()函数。   list不提供容量,内存分配的操作函数,因为完全没必要,每个元素都有自己的内存空间,在删除之前一直有效。   list提供专门的函数用于移动函数,这些函数执行效率高,无需元素的拷贝和移动,只需要调整若干指针。 3、操作函数 3.1 构造和析构 操作 效果 list<Elem> c 产生一个空的list list<Elem> c1(c2) 产生一个c2同型的list,每个元素都被复制 list<Elem> c(n) 产生一个n个元素的list,每个元素都由default构造产生 list<Elem> c(n,elem) 产生一个n个元素的list

python 迭代器和生成器

左心房为你撑大大i 提交于 2020-02-19 11:14:55
首先关于迭代器和生成器,要明白以下几点: 1.迭代是Python最强大的功能之一,是访问集合元素的一种方式。 2.迭代器是一个可以记住遍历的位置的对象。 3.迭代器对象从集合的第一个元素开始访问,直到所有的元素被访问完结束。迭代器只能往前不会后退。 4.迭代器有两个基本的方法: iter() 和 next() 。 5.在 Python 中,使用了 yield 的函数被称为生成器(generator)。 6.跟普通函数不同的是,生成器是一个返回迭代器的函数,只能用于迭代操作,更简单点理解生成器就是一个迭代器。 7.在调用生成器运行的过程中,每次遇到 yield 时函数会暂停并保存当前所有的运行信息,返回 yield 的值, 并在下一次执行 next() 方法时从当前位置继续运行。 8.调用一个生成器函数,返回的是一个迭代器对象。 这些是在网上搜集的关于迭代器和生成器的一些基本知识,下面是我根据这些做的练习 list=[1,2,3,4]print(list)it=iter(list)for i in it: if i == 4: print("four") break print(i,end="")import sys # 引入 sys 模块list = [1, 2, 3, 4]it = iter(list) # 创建迭代器对象while True: try: print(next

《Effective python》-第2章 函数

笑着哭i 提交于 2020-02-19 04:24:09
文章目录 15.如何在闭包里使用外围作用域中的变量 16.考虑使用生成器来改写直接返回列表的函数 17.在迭代器上面反复迭代会出错 20.用None和文档字符串来描述具有动态默认值的参数 21.用关键字参数确保代码清晰 15.如何在闭包里使用外围作用域中的变量 可参考文章: python的闭包问题 总结 :可使用nonlocal语句,改为辅助类,使用单元素列表或集合等获取外围作用域的变量。 def sort_priority ( values , group ) : # 外部作用域 """功能:把在group中的元素排在所有值的前面,若存在group范围内的值,found为True""" found = False def helper ( x ) : # 闭包 if x in group : found = True # 实际上并未修改上面的值 return ( 0 , x ) return ( 1 , x ) values . sort ( key = helper ) return found numbers = [ 8 , 3 , 1 , 2 , 5 , 4 , 7 , 6 ] group = { 2 , 3 , 5 , 7 } print ( sort_priority ( numbers , group ) ) # False print ( numbers ) #

set和迭代器失效总结

寵の児 提交于 2020-02-18 19:43:35
set 的相关知识点:重点是 去重 和 排序 !!! 默认按照 升序 排列!!! set 的常见操作: 1. 定义:set<数据类型>name; 2. 与map不同,count使用来 判别一个元素是否存在在set中 name.count(x); 3. name.insert(x); 4. name.erase(x);//插入和删除都要注意迭代器失效!!! erase函数返回被删除元素的下一个元素的迭代器。 erase(iterator) ,删除定位器iterator指向的值 erase(first,second),删除定位器first和second之间的值 erase(key_value),删除键值key_value的值 5. name.size(); 1. http://acm.nefu.edu.cn/contestShow.php 第一点要设置集合数组!!! 第二点找两个集合中相同数目的个数的方法: int k=0; for(set::iterator it=vis[num1].begin(); it!=vis[num1].end(); it++) if(vis[num2].count(*it)) k++; # include <bits/stdc++.h> using namespace std ; set < int > vis [ 52 ] ; int main ( )

java设计模式--迭代器模式

断了今生、忘了曾经 提交于 2020-02-18 07:31:49
迭代器模式   迭代器模式又称游标模式是对象行为型模式,主要是为了提供一种方法顺序访问一个聚合对象中各个元素,而又不需要暴露聚合对象的内部结构。说到迭代器,我们都很熟悉,例如HashSet中如果我们需要遍历HashSet中的每个元素则需要通过Iterate不停的next()后来遍历,那么通过Iterator来遍历集合中的元素有什么好处呢?很明显我们在不知道HashSet的具体实现时,我们也可以通过Iterator来遍历集合,所以 使用者不需要关心HashSet内部的实现也不需要关系遍历的规则 ,那么同时设计者也可以随意的改动遍历规则而不影响使用者的使用。 迭代器模式的适用性   访问一个聚合对象而无需暴露它的内部表示。   支持对聚合对象的多种遍历。   为遍历不同的聚合结构提供一个统一的接口(支持迭代器复用)。 迭代器模式的结构图 迭代器模式中总共分为4类角色: 1、抽象迭代器角色(Iterator):定义了访问和遍历聚合元素的接口。 2、具体迭代器角色(ConcreteIterator):实现迭代器接口,并且记录遍历中的当前位置。 3、抽象聚合角色(Aggregate):负责提供创建具体迭代器角色的接口。 4、具体聚合角色(ConcreteAggregate):实现创建相应迭代器的接口,该操作返回一个合适的具体迭代器角色。 迭代器模式的示例   抽象聚合角色

Scala集合(二)

℡╲_俬逩灬. 提交于 2020-02-17 23:27:29
将函数映射到集合 map方法 val names = List("Peter" , "Paul", "Mary") names.map(_.toUpperCase) // 等同于 for(n <- names) yield n.toUpperCase flatMap方法,如果函数产出一个集合,又想将所有值串联在一起 def ulcase(s:String) = Vector(s.toUpperCase(), s.toLowerCase()) names.map(ulcase)得到 List(Vector("PETER","peter"), Vector("PAUL","paul"), Vector("MARY","mary")) names.flatMap(ulcase)得到 List("PETER","peter","PAUL","paul","MARY","mary") collect 方法用于 partial function,那些并没有对所有可能的输入值进行定义的函数, 产出被定义的所有参数的函数值得集合 "-3+4".collect(case '+' -> 1; case '-' -> -1) // vector(-1,1) foreach方法 names.foreach(println) 化简、折叠和扫描 List(1,7,2,9).reduceLeft(_ - _)

[Aizu] ITP2_8_D: Multi-Map

做~自己de王妃 提交于 2020-02-17 13:19:25
前言 ITP系列的题目, 只是为了了解基础的用法的, 所以为了提高效率, 不再记录完整的内容, 只侧重于本题中所使用到的一些知识 题目 传送门: ITP2_8_D: Multi-Map 求解 用法 multimap与map几乎相同, 不过区别在于, multimap一个键值可以对应多个值, 而map一个键只会对应一个值 find()方法和map有区别, multimap的find()方法会在所有满足条件的元素中随机返回一个指向该元素的迭代器 看方法的说明里面lower_bound()方法只是返回一个指向第一个不小于键的元素的迭代器, 实际使用的时候似乎跟插入的顺序有关系. 通过lower_bound()与upper_bound()可以遍历所有的键对应的元素, 而且是按照插入顺序遍历的. 关于multimap的常用方法参见之前的map常用方法(同样只针对于本题目),直接搬过来了 方法名 描述 示例 insert((key, val)) 向multimap中插入元素(key, val) my_map.insert(make_pair(key, val)); erase(key) 删除含有key的元素 my_map.erase(key); find(key) 搜索与key一致的元素, 并返回指向该元素的迭代器, 如果存在多个元素则随机返回一个, 如果不存在, 则返回指向末尾的迭代器end

c++ STL中的set和multiset

陌路散爱 提交于 2020-02-17 11:32:28
1.结构 set和multiset会根据特定的排序原则将元素排序。两者不同之处在于,multisets允许元素重复,而set不允许重复。 set中的元素可以是任意类型的,但是由于需要排序,所以元素必须有一个序,即大小的比较关系,只要是assignable、copyable、comparable(根据某个排序准则)的型别T,都可以成为set或者multisets的元素。 2.底层实现 和所有的标准关联容器类似,sets和multisets通常以平衡二叉树完成。 自动排序的主要优点在于使二叉树搜寻元素具有良好的性能,在其搜索函数算法具有对数复杂度。但是自动排序也造成了一个限制,不能直接改变元素值,因为这样会打乱原有的顺序,要改变元素的值,必须先删除旧元素,再插入新元素。所以sets和multisets具有以下特点: -不提供直接用来存取元素的任何操作元素。 -通过迭代器进行元素的存取。 3.成员函数 begin()--返回指向第一个元素的迭代器 clear()--清除所有元素 count()--返回某个值元素的个数 empty()--如果集合为空,返回true end()--返回指向最后一个元素的迭代器 equal_range()--返回集合中与给定值相等的上下限的两个迭代器 erase()--删除集合中的元素 find()--返回一个指向被查找到元素的迭代器 get

初探迭代器Iterators

落花浮王杯 提交于 2020-02-17 11:26:47
一、概念引入: 除了使用下标来访问容器对象的元素外,标准库还提供了另一种访问元素的方法:使用迭代器(Iterators)。 迭代器是一种 检查容器内元素并遍历元素的 数据类型 。 所有的标准库容器都定义了相应的迭代器类型,而只有少数的容器支持下标操作。 因为迭代器对所有的容器都适用,现代 C++ 程序更倾向于使用迭代器而不是下标操作访问容器元素,即使对支持下标操作的 vector 类型也是这样。(即: 尽量使用迭代器访问容器元素 。) 二、困惑——迭代器和迭代器类型 最开始的时候容易搞不清楚,原因之一是由于同一个术语 iterator 往往表示两个不同的事物。 一般意义上指的是迭代器的概念;而具体而言时指的则是由容器定义的具体的 iterator 类型,如 vector<int> 。 重点要理解的是,有许多用作迭代器的类型,这些类型在概念上是相关的。若一种类型支持一组确定的操作(这些操作可用来遍历容器内的元素,并访问这些元素的值),我们就称这种类型为迭代器。 即: 每个容器都定义了一个名为 iterator 的类型,而这种类型支持(概念上的)迭代器的各种操作。 三、begin 和 end 操作 每种容器都定义了一对命名为 begin 和 end 的函数,用于返回迭代器。 如果容器中有元素的话,由 begin 返回的迭代器指向第一个元素。 由 end 操作返回的迭代器指向