迭代器

迭代器与生成器

佐手、 提交于 2019-12-02 06:04:45
一、迭代器的特征 迭代器有一个next()方法,每次调用时会返回一个对象,该对象的结构为{value:xxx,done:true},其中value表示下次应该返回的值,done表示是否还有值可提供。 当没有值可提供时,done为true,如果迭代器在迭代结束时使用了return xxx,则value为xxx,否则为undefined。 function createIterator(items) { var i = 0 ; return { next: function () { var done = (i >= items.length); var value = !done ? items[i ] : undefined; return { done: done, value: value }; } }; } var iterator = createIterator([1, 2, 3 ]); console.log(iterator.next()); // "{ value: 1, done: false }" console.log(iterator.next()); // "{ value: 2, done: false }" console.log(iterator.next()); // "{ value: 3, done: false }" console.log

TreeMap源码实现类中文全解析

依然范特西╮ 提交于 2019-12-02 05:14:30
/** * 基于红黑树(Red-Black tree)的 NavigableMap 实现。该映射根据其键的自然顺序进行排序, * 或者根据创建映射时提供的Comparator 进行排序,具体取决于使用的构造方法。 * * 此实现为 containsKey、get、put 和 remove 操作提供受保证的 log(n) 时间开销。 * 这些算法是 Cormen、Leiserson和 Rivest 的 Introduction to Algorithms 中的算法的改编。 * * 注意,如果要正确实现 Map 接口,则有序映射所保持的顺序(无论是否明确提供了比较器)都 * 必须与 equals 一致。(关于与 equals 一致的精确定义,请参阅 Comparable 或 Comparator)。 * 这是因为 Map 接口是按照 equals 操作定义的,但有序映射使用它的compareTo(或 compare)方法 * 对所有键进行比较,因此从有序映射的观点来看,此方法认为相等的两个键就是相等的。 * 即使排序与 equals不一致,有序映射的行为仍然是 定义良好的,只不过没有遵守 Map 接口的常规协定。 * * 注意,此实现不是同步的。如果多个线程同时访问一个映射,并且其中至少一个线程从结构上 * 修改了该映射,则其必须外部同步。

C++ vector容器 find erase的使用:查找并删除指定元素

穿精又带淫゛_ 提交于 2019-12-02 04:55:02
概念:容器、迭代器、算法 STL包括容器、迭代器和算法: 容器 用于管理一些相关的数据类型。每种容器都有它的优缺点,不同的容器反映出程序设计的不同需求。容器自身可能由数组或链表实现,或者容器中的每个元素都有特殊的关键值。 迭代器 用于遍历一个数据集中的每个元素。这些数据集可能是容器或者容器的子集。迭代器的主要优点是它们为任意类型的容器提供一个小巧并且通用(注意通用很重要)的接口。例如,迭代器接口的一个操作是让它依次遍历数据集的每个元素。这个操作是依赖容器的内总部结构独立完成的。迭代器之所以有效是因为容器类提供它自己的迭代器类型来做“正确的事”,容本身的迭代器了解容器的内部结构。 迭代器的接口几乎相当于普通的 指针 。让一个迭代器递增只需调用 ++ 操作符。使用 * 操作符可以得到迭代器引用的数据值。因而迭代器可以被任为是一种智能指针。 算法 被用于处理数据集中的元素。例如它们可以搜索、排序、修改数据或者其他目的。算法使用迭代器,因此,一个算法只需被编写一次就可以用于任意的容器,因为迭代器的接口对所有类型的容器是通用的。这就是find()的位置 为了给算法更多的扩展性,需要提供一些被算法调用的附属函数。可以使用通用算法去适应非常特别和复杂的需求。你可以提供自己的搜索标准或者特殊的操作去绑定元素。 STL的概念是将数据和操作独立开来。数据由容器类管理,而操作是由可配置的算法定义

第五篇 函数进阶

家住魔仙堡 提交于 2019-12-02 03:32:29
目录 第五篇 函数进阶 一 闭包函数 二 装饰器 三 迭代器 四 三元表达式 五 列表推导式 六 字典生成式 七 生成器 八 递归 九 匿名函数 十 内置函数 第五篇 函数进阶 ==回顾基础== 函数对象:可以将定义在函数内的函数返回到全局使用,从而打破函数的层级限制. 名称空间与作用域:作用域关系在函数定义阶段时就已经固定死了,与调用位置无关,即在任意位置调用函数都需要跑到定义函数时找到作用域关系. 一 闭包函数 闭包 闭就是封闭(函数内部函数),包就是包含(该内部函数对外部作用域而非全局作用域的变量的引用).闭包指的是:函数内部函数对外部作用域而非全局作用域的引用. 提示 之前我们都是通过参数将外部的值传给函数,闭包提供了另外一种思路,包起来咯,包起哟,包起来哇 def outter(): x = 1 def inner(): print(x) return inner f = outter() def f2(): x = 2 f() f2() # 1 两种为函数传参的方式 使用参数的形式 包给函数 闭包函数的应用 闭包的意义:返回的函数对象,不仅仅是一个函数对象,在函数还包裹了一层作用域,这使得,该函数无论在何处调用,优先使用自己外层包裹的作用域. 应用领域:延迟计算(原来我们是传参,现在我们是包起来),爬虫领域. import requests def ger(ur1):

JavaSE学习笔记:集合框架、迭代器、泛型

穿精又带淫゛_ 提交于 2019-12-02 00:47:22
文章目录 一、集合框架概述 1.Collection和Map 2.Collection集合 3.Collection集合常用方法 二、迭代器 1.常用方法 2.如何获取迭代器 3.使用步骤(掌握) 4.使用实例 5.迭代器使用原理 三、增强型for循环(更常用) 1.简介 2.使用实例 3.注意点 四、泛型 1.泛型的概念 2.使用泛型的好处 2.1使用集合对象,不使用泛型会带来的问题 2.1.1实例 2.1.2注意点 2.2使用集合使用泛型 2.2.1实例 2.2.2注意点 3.定义和使用含有泛型的类 4.定义和使用含有泛型的方法 4.1定义方法 4.2实例 5.定义和使用含有泛型的接口 5.1第一种使用方式 5.2第二种使用方式 6.泛型通配符 6.1基本使用:只能作为方法的参数使用 6.2不能创建对象使用 6.3泛型的上限限定和下限限定(了解) 6.3.1上限 6.3.2下限 五、List集合 1、List接口的三大特点 2.List接口中带索引的方法(独有) 2.1方法使用实例 3.注意:操作索引的时候,一定要防止索引越界异常 4.ArrayList实现类 5.LinkedList实现类 5.1特点 5.2特有方法 5.3使用实例 6.Vector(了解) 六、Set集合 1.特点 2.HashSet(常用来去重) 2.1特点 2.2使用实例 3.哈希值 3

JavaSE学习笔记--集合框架

女生的网名这么多〃 提交于 2019-12-02 00:44:20
//集合与数组的区别:集合不定长度,数组定长;集合只存储对象,数组什么都可以存。 //集合框架内不同的集合依据其内部不同的数据结构进行区分 Iterable//(接口)(内部有返回迭代器的方法) |--Collection //(接口)单列集合。方法:添加;删除;判断;获取(迭代器)。Itertor定义在Collection内部(Itertor是个内部类) //迭代器与枚举的区别:(1)迭代器允许调用者利用定义良好的语义在迭代期间从迭代器所指向的 collection 移除元素;(2)方法名称得到了改进。 |--List //(接口)有序的(存取顺序一致);元素可重复;元素有角标;有ListIterator列表迭代器。 //方法:添加;删除;判断;获取;修改;listItertor(获取列表迭代器,列表迭代器在Itertor上增加了新功能)。注意:使用迭代器容易出现并发修改异常 |--ArrayList //底层数据结构为数组;查询快。不同步,不安全;可变长度数组(以50%的速度增长:*3/2+1);多了个枚举(过时了,不用) |--Vector //底层数据结构为数组;支持枚举;效率低被ArrayList取代;同步,安全;可变长度数组(以100%的速度增长) |--LinkedList //底层数据结构为链表;增删快。不同步,不安全 |--Set //(接口)无序的;元素不可重复

Javase学习记录之------集合迭代器并发修改异常及解决

孤人 提交于 2019-12-02 00:44:07
判断集合中是否有word这个单词,如果有,就添加一个新的单词奥利给 import java . util . ArrayList ; import java . util . Iterator ; import java . util . List ; import java . util . ListIterator ; public class Demo { public static void main ( String [ ] args ) { List list = new ArrayList ( ) ; list . add ( "hallo" ) ; list . add ( "word" ) ; list . add ( "java" ) ; /* Iterator it=list.iterator(); while (it.hasNext()){ String s=(String)it.next(); if("word".equals(s)){ list.add("奥利给"); } System.out.println(s); } 报错ConcurrentModificationException 因为迭代器是依赖集合存在的,判断成功后集合中添加了新元素,而迭代器却不知道,就报了并发修改的错误 迭代器遍历元素的时候,集合是不能修改元素的 解决方法 1

Javase学习记录之------集合遍历迭代器的使用

↘锁芯ラ 提交于 2019-12-02 00:42:42
Iterator iterator();迭代器,集合的专属遍历方式; 迭代器被定义成一个接口而不是类; 各种集合的遍历方式不同,所以迭代器中的方法在具体的子类中,以内部类的方式体现 Iterator类中的iterator()就是迭代器; 使用方法iterator()要求容器返回一个Iterator。 第一次调用Iterator的next()方法时,它返回序列的第一个元素。注意:iterator()方法是java.lang.Iterable接口,被Collection继承 Object next();获取元素,并移动到下一个位置; next方法,返回的是集合的元素,而集合元素的类型可以是任意类型的,有不确定性,而为了达到代码的通用性,直接指定返回的是Object类型(返回基类) 可以使用泛型明确返回值的类型。 import java . util . ArrayList ; import java . util . Collection ; import java . util . Iterator ; public class CollectionDemo { public static void main ( String [ ] args ) { Collection c = new ArrayList ( ) ; c . add ( "hallo" ) ; c . add (

Python高阶用法总结

家住魔仙堡 提交于 2019-12-02 00:17:24
目录 1. lambda匿名函数 1.1 函数式编程 1.2 应用在闭包 2. 列表解析式 3. enumerate内建函数 4. 迭代器与生成器 4.1 迭代器 4.3 生成器 5. 装饰器 前言: 接触python有一段时间了,从开始的看菜鸟的python教程,看了一些视频,一些书。很多人感觉python很简单,确实相比其他语言,python可能稍微简单一点,但是不能说只学了python基础语法就说自己python水平可以了。最近在阅读YOLOv3的pytorch版本源码,就遇到很多瓶颈,很多是与python相关的。所以这篇进行总结一下,收集一下所有的问题,更深入理解python高阶用法,并且尽量每个都附上例子,做一个认真的coder,bloger。 1. lambda匿名函数 lambda匿名函数在一些工程项目中经常出现,理解该用法是读懂项目的前提。如: lf = lambda x: 1 - 10 ** (hyp['lrf'] * (1 - x / epochs)) 匿名函数就是没有定义函数的名称,用来实现简单的功能。 语法结构: lambda param_list: expression param_list 就是参数列表,相当于函数的参数 expression 就是表达式,相当于函数体,用一行进行表示 举个简单的例子: >>> func=lambda x, y: x+y

STL源码剖析——序列式容器#1 Vector

本秂侑毒 提交于 2019-12-01 23:19:13
  在学完了Allocator、Iterator和Traits编程之后,我们终于可以进入STL的容器内部一探究竟了。STL的容器分为序列式容器和关联式容器,何为序列式容器呢?就是容器内的元素是可序的,但未必有序。C++本身就提供了一种序列式容器array(即数组),而STL就提供了多种序列式容器,这些容器都是基于常见的数据建构开发出来的,例如vector、list、deque等等。接下来我们将会对STL里的所有序列式容器进行逐一的学习。   本节要学的容器就是我们日常开发中使用最多的vector,vector的数据安排以及操作方式,与array非常相似。两者唯一的区别在于空间运用的灵活性。array是静态空间,配置了其大小就不能被改变,如果空间满了,要换大的,这只能自己手动来:配置新空间,将元素从旧址一一复制过去,再把原来的空间释放。而vector是动态空间,随着元素的加入,它内部会自行扩充空间,进行元素的复制并释放旧空间。所以在使用上,我们更趋向于使用vector而非array,因为不用考虑元素个数的问题,很适合动态元素个数的情况。我们不必因为害怕空间不足而一开始就要求一个大块头的array了。   我们先从vector类里的public部分出发,因为这部分是我们在使用vector时经常接触到的一些接口,从这些接口开始逐渐深挖,探究其里面的运作机制