迭代器

学习:STL概念学习

拟墨画扇 提交于 2019-12-05 18:02:32
STL初识: 为了建立数据结构和算法的一套标准,诞生了STL STL基本概念: STL(Standard Template Library,标准模板库) STL 从广义上分为: 容器(container) 算法(algorithm) 迭代器(iterator) 容器和算法之间通过迭代器进行无缝连接。 STL 几乎所有的代码都采用了模板类或者模板函数 STL六大组件: STL大体分为六大组件,分别是:容器、算法、迭代器、仿函数、适配器(配接器)、空间配置器 1、容器: 各种数据结构,如vector、list、deque、set、map等,用来存放数据。 2、算法: 各种常用的算法,如sort、find、copy、for_each等 3、迭代器: 扮演了容器与算法之间的胶合剂。 4、仿函数: 行为类似函数,可作为算法的某种策略。 5、适配器: 一种用来修饰容器或者仿函数或迭代器接口的东西。 6、空间配置器: 负责空间的配置与管理。 STL中的容器: 容器: 置物之所也 STL容器就是将运用最广泛的一些数据结构实现出来 常用的数据结构:数组, 链表,树, 栈, 队列, 集合, 映射表等 这些容器分为 序列式容器 和 关联式容器 两种: 序列式容器: 强调值的排序,序列式容器中的每个元素均有固定的位置。 关联式容器: 二叉树结构,各元素之间没有严格的物理上的顺序关系 STL中的算法: 算法

学习:容器算法迭代器

假装没事ソ 提交于 2019-12-05 18:02:12
vector存放内置数据类型: 容器: vector 算法: for_each 迭代器: vector ::iterator 示例代码: #include<iostream> #include<algorithm> #include<string> #include<vector> using namespace std; //第三种方法需要的函数 void toprint(int val) { cout << val << endl; //其实我们可以看下for_each的定义中实现的 //for (; _UFirst != _ULast; ++_UFirst) //{ // _Func(*_UFirst); 把传入的函数进行了调用,func传入的是* //} } void test01() { vector<int> v; //创建一个int类型的vector容器 v.push_back(10); //放入相应的数值 v.push_back(20); v.push_back(30); v.push_back(40); //第一种方式进行遍历容器中的数值 //vector<int>::iterator 拿到vector<int>这种容器的迭代器类型 //vector<int>::iterator pBegin = v.begin(); //v.begin()返回迭代器

TypeScript 迭代器(iterator)和生成器(generator)

放肆的年华 提交于 2019-12-05 17:22:35
⒈迭代器(iterator)   1.可迭代性   当一个对象实现了 Symbol.iterator 属性时,我们认为它是可迭代的。 一些内置的类型如 Array , Map , Set , String , Int32Array , Uint32Array 等都已经实现了各自的 Symbol.iterator 。 对象上的 Symbol.iterator 函数负责返回供迭代的值。   2.for..of语句   for..of 会遍历可迭代的对象,调用对象上的 Symbol.iterator 方法。 下面是在数组上使用 for..of 的简单例子: let array = [7, "fanqi", true]; for (let item of array) { console.log(item); // 7, "fanqi", true }   3. for..of vs. for..in 语句   for..of 和 for..in 均可迭代一个列表,但它们之间的区别很大,最明显的区别莫过于它们用于迭代的值不同, for..in 迭代的是对象 键 的列表,而 for..of 迭代的是对象 值 的列表。   下面的例子展示了两者之间的区别: let list = [4, 5, 6]; for (let i in list) { console.log(i); // "0",

极*Java速成教程 - (5)

帅比萌擦擦* 提交于 2019-12-05 17:10:29
Java语言基础 容器 这个世界是有序的,将Java对象零散地放到内存中是不符合世界常理的,特别是有一大组相似的甚至不知道有多少数据的时候。把Java对象装进盒子里可以有序收纳,这个盒子就叫容器。 初次了解泛型 泛型,就是泛泛而指的类型,就是不确定具体类型的类型。Java提供的容器,一般都支持泛型,也就是说不管是什么对象,都可以丢到容器中进行收纳。但在Java中,所有类都继承自Object,所以把对象当作Object对象丢到容器里不会有任何问题,但当拿出来这个Object的时候,由于不知道这个对象的真正类型是什么,就可能在向下转型的时候出现错误,为了避免这种情况,一般对容器使用 <type> 表示容器的具体类型参数,也就是容器里放什么类就确定了,编译器就会对类型进行检查,避免运行时Object对象向下转型时错误的发生。例如: List<Apple> apples = new ArrayList<Apple>(); 你应当创建一个具体类的对象,将其转型为对应的接口,然后在其余的代码中都使用这个接口。 容器的类型 Collection 一个独立元素的序列,符合某种规则,提供迭代器,可以用foreach进行迭代遍历,也就是提供一个方法,可以每次从序列中从前到后依次拿到每一个元素。 List 有序的序列,对象元素按照插入顺序保存 ArrayList 连续储存的List,可以使用数字来查找值

PL真有意思(四):控制流

旧巷老猫 提交于 2019-12-05 16:57:04
前言 对大多数计算模型而言,顺序都是基本的东西,它确定了为完成所期望的某种工作,什么事情应该最先做,什么事应该随后做,我们可以将语言规定顺序的机制分为几个类别: 顺序执行 选择 迭代 过程抽象 递归 并发 异常处理和推断 非确定性 对于不同类别的语言对不同类别的控制流的重要性也不尽相同,比如顺序执行相比于函数式对于命令式则更加重要。而命令式中更倾向用迭代,函数则更强调递归 表达式求值 在讨论控制流之前先讨论下表达式的问题,先明确两个概念:运算符通常是指那些采用特殊语法形式的内部函数(比如+-*/等),运算对象指的是运算符的参数(如2+3,2和3就是运算对象),那么运算符和运算对象的组合就是表达式。一般根据运算符出现的位置(相对于运算对象而言),可以分为3类表示形式:前缀、中缀和后缀。比如Lisp就运用前缀语法: (+ 1 3 4 6) (* (+ 1 7) 8) 大多数命令式语言对二元运算符都使用中缀记法,而对一元运算符和其它函数使用前缀激发。但是像Lisp就全部统一使用中缀记法 优先级和结合性 大多数程序设计语言都提供丰富的内部算术。在用中缀方式(没有括号)写出就可能出现歧义。所以就需要优先级和结合性来解决歧义性,但是我觉得 妈的你写括号就完事儿了 而且不同语言的优先级和结合性也不尽相同 赋值 在纯函数式语言中,程序的基本组成部分是表达式,计算也仅是对表达式求值

函数名 迭代器 任意表达式 插入表达式 等操作

半世苍凉 提交于 2019-12-05 16:51:26
函数名的作用 1.函数名的内存地址 def func(): print("呵呵") print(func) 结果: <function func at 0x1101e4ea0> 2.函数名可以赋值给其他变量 def func(): print("呵呵") print(func) a = func # 把函数当成一个值赋值给另一个变量 a() # 函数调用 func() 结果: 呵呵 <function func at 0x0000025089261E18> 3.函数名可以当做容器类的元素 def func1(): print("呵呵") def func2(): print("呵呵") def func3(): print("呵呵") def func4(): print("呵呵") lst = [func1, func2, func3] for i in lst: i() 结果: 呵呵 呵呵 呵呵 4.函数名可以当做函数的参数 def func(): print("吃了么") def func2(fn): print("我是func2") fn() # 执行传递过来的fn print("我是func2") func2(func) # 把函数func当成参数传递给func2的参数fn. 结果: 我是func2 吃了么 我是func2 5.函数名可以作为函数的返回值 def func

Python 函数 III

只愿长相守 提交于 2019-12-05 12:23:52
今日内容 默认参数的坑 函数名的应用 python新特性:f-string 可迭代对象 迭代器 可迭代对象与迭代器的对比 昨日回顾 万能参数,动态参数 def func(*args,**kwargs): pass #函数的定义:*将实参角度的所有位置参数聚合成一个元组,赋值给args #**将实参角度的所有的关键字参数聚合成一个字典赋值kwargs func(*[1,2,3],**{'name':'alex','age':18})#函数的执行:* ** 打散 第四种传参: 仅限关键字参数:* ,c 形参角度的最终顺序: 位置参数,*args,默认参数,仅限关键字参数,**kwargs 名称空间: 内置,全局,局部 取值,加载顺序 加载:内置,全局,局部 取值:就近原则 作用域 全局,局部 glocals():返回字典,全局作用域的所有内容 locals():返回字典,当前作用域的所有内容 嵌套函数 具体内容 默认参数的坑 #当默认参数是可变的数据类型,坑坑坑 def func(a,l=[]): l.append(a) return l print(func(1))#[1,] print(func(2))#[1,2] print(func(3))#[1,2,3] def func(val,li=[]): li.append(val) return li list1 = func(1)

9 . 推导式 ; 生成器send 与 yield from 2019-11-22

倖福魔咒の 提交于 2019-12-05 07:31:00
推导式(comprehensions) 通过一行循环判断,遍历出一系列数据的方式是推导式语法: val for val in Iterable (把想要的值写在 for的左侧)里面是一行循环判断!根据套在推导式外层的符号判断具体是什么类型的推导式​推导式种类三种: [val for val in Iterable] 列表推导式 {val for val in Iterable} 集合推导式 {a:b for a,b in iterable} 字典推导式 列表推导式,集合推导式,字典推导式的相关写法 (1)普通推导式(2)带有判断条件的推到式(3)多循环推到式(4)带有判断条件的多循环推到式 ### (1)enumerateenumerate(iterable,[start=0])功能:枚举 ; 将索引号和iterable中的值,一个一个拿出来配对组成元组放入迭代器中参数: iterable: 可迭代性数据 (常用:迭代器,容器类型数据,可迭代对象range) start: 可以选择开始的索引号(默认从0开始索引)返回值:迭代器 ### (2)zipzip(iterable, ... ...) 功能: 将多个iterable中的值,一个一个拿出来配对组成元组放入迭代器中 iterable: 可迭代性数据 (常用:迭代器,容器类型数据,可迭代对象range) 返回:

第四章迭代器和生成器

二次信任 提交于 2019-12-05 06:46:01
Python CookBook 笔记 第四章迭代器和生成器 4.1 手动遍历迭代器 iter()函数可以将list转换为迭代器,从而使用next()函数获取迭代器结果 4.2实现迭代器协议 Python 的迭代协议要求一个 iter () 方法返回一个特殊的迭代器对象,这个迭代器对象实现了 next () 方法并通过 StopIteration 异常标识迭代的完成 class Node2: def __init__(self, value): self._value = value self._children = [] def __repr__(self): return 'Node({!r})'.format(self._value) def add_child(self, node): self._children.append(node) def __iter__(self): return iter(self._children) def depth_first(self): return DepthFirstIterator(self) class DepthFirstIterator(object): ''' Depth-first traversal ''' def __init__(self, start_node): self._node = start

基础之杂货铺

╄→尐↘猪︶ㄣ 提交于 2019-12-05 06:45:58
生成器 (generator) (1)列表生成式: 使代码更简洁,适合数据量比较小,如果数据量非常大,就可以用 函数 作生成器(如下例:斐波那契数列) 1 a = [i*2 for i in range(10)] 2 # 得到列表a=[0, 2, 4, ... , 18] 3 # 等价于 4 a = [] 5 for i in range(10): 6 a.append(i * 2) 7 补充:a = [该参数可以是函数 for i in range(10)] 列表生成式 (2)生成器的定义: 1) 只有 在 调用 时才会生成 相应的数据 ,一次性的【节省内存空间】,列表生成器只要把一个列表生成式的 [ ] 改成 ( ),用next()或.__next__()取值 1 c = (i*2 for i in range(10)) # 生成器 2 print(c) 3 # c: <generator object <genexpr> at 0x01E47F00> 4 for i in c: 5 print(i) 6 7 c = [i*2 for i in range(10)] # 生成式 8 print(c) 9 # c:[0, 2, 4, 6, 8, 10, 12, 14, 16, 18] 列表生成器 2) 只记录 当前位置 c. __next__ () -->取下一个数据