迭代器

迭代器和指针、指针和引用

[亡魂溺海] 提交于 2019-12-02 12:04:20
迭代器和指针的区别: 相同的点: 都可以进行整数操作进行加减运算,实现当前位置的移动;支持同类型的进行减法操作,得到两个指针之间的距离。 不同点: 迭代器: 1、 迭代器不是指针是类模版,表现像指针。它模拟了一些指针的功能, 通过重载指针的一些操作符。本质是封装了原生指针,相当于指针的一种升级。 2、 迭代器返回的是对象的引用而不是对象的值。 指针: 1、 指针有迭代器不能完成的功能, 比如指向函数。迭代器只能指向容器。 两者行为表现很像,但是本质不一样。 指针和引用的区别: 1、 指针占用内存, 引用只是别名本身不占内存。指针 可以有多级,而引用只有一级。 2、 引用使用的时候不需要解引用, 指针要 3、 引用必须初始化,指针不要 4、 引用不能为空, 而指针可以为空 5、 引用一旦初始化就不能改变,指针可以改变。 6、 sizeof操作符得到的是指针本身的大小,而引用得到的是对象的大小 7、 引用的++ – 操作相当于变量本身的值的改变操作,指针的++ – 操作则是地址指向的移动。 all 来源: CSDN 作者: danneel_zhu 链接: https://blog.csdn.net/danneel/article/details/70216168

python迭代器、生成器和装饰器

对着背影说爱祢 提交于 2019-12-02 12:01:56
文章目录 生成器 生成器表达式(generator expression) 通过使用yield关键字定义 生成器并行 前戏 高潮 迭代器 迭代器概述 iter()函数 创建迭代器 创建一个迭代器(类) 内置迭代器工具 count无限迭代器 cycle 无限迭代器,从一个有限序列中生成无限序列: itertools的子模块 islice 控制无限迭代器输出的方式 装饰器 高阶函数 嵌套函数 高阶函数+嵌套函数 = 装饰器 类装饰器 带参数的decorator 实例---登录认证 生成器 通过列表生成式,我们可以直接创建一个列表。但是,受到内存限制,列表容量肯定是有限的。而且,创建一个包含100万个元素的列表,不仅占用很大的存储空间,如果我们仅仅需要访问前面几个元素,那后面绝大多数元素占用的空间都白白浪费了。 所以,如果列表元素可以按照某种算法推算出来,那我们是否可以在循环的过程中不断推算出后续的元素呢?这样就不必创建完整的list,从而节省大量的空间。在Python中,这种一边循环一边计算的机制,称为生成器:generator。 要创建一个generator,有很多种方法。第一种方法很简单,只要把一个列表生成式的[]改成(),就创建了一个generator: 生成器表达式(generator expression) L = [ x + 1 for x in range ( 10 )

C++中的迭代器和迭代器的辅助函数

天涯浪子 提交于 2019-12-02 12:01:41
一、迭代器的基本概念 1、 迭代器不仅仅是指针 可以指向容器中的一个位置,通过迭代器访问这个位置的元素,而不必关心这个位置对应的 是真正的物理地址 2、迭代器是算法和容器的“中间人” 3、迭代器对存储在容器中的元素序列进行遍历,提供的访问容器中每个元素的方法 4、指针式迭代器中的一种 5、迭代器是泛化的指针,提供了类似指针的操作(诸如++、*、->运算符) 6、两个迭代器表示一个区间: [p1,p2) 左闭右开,stl算法常以迭代器的区间作为输入,传奇输入数据 二、迭代器的分类: 输入迭代器:可以用来从序列中读取数据 p1 == p2; p1 != p2; *p1; p1->m; *p1++ 输出迭代器:允许向序列中写入数据 *p1 = t; *p1++ = t; p1++的返回值不确定 前向迭代器:即是输入迭代器又是输出迭代器,并且可以对序列进行单向的遍历 *p1; p1++ 双向迭代器:与前向迭代器相似,但是在两个方向上都可以对数据遍历 --p1; p1-- 随机访问迭代器:也是双向迭代器,但是能够在序列中的任意两个位置之间进行跳转,如指针、使用vector的begin()、end()函数得到的迭代器 p1 += n; p1 -= n; p1 - p2; p1 比较运算符 p2; p1[n] 例:自定义函数对象: #include <stdlib.h> #include

迭代器

不想你离开。 提交于 2019-12-02 12:01:25
迭代器 分类 输入迭代器input iterator 输出迭代器output iterator 前向迭代器forward iterator 双向迭代器bidirectional iterator 随机存取迭代器random iterator 迭代器的适配器 分类 插入迭代器 反向遍历迭代器reverse_iterator 流迭代器 迭代器 迭代器就是封装了的指针 访问受限制的容器一般不可以使用迭代器,如栈,队列。 分类 1.输入迭代器(input iterator) 取出所指向的值,并指向下一个元素 判断是否到达最后一个元素 可以复制 必须支持*,+ +,+ +(int),!=,==这5个运算符。 2.输出迭代器(output iterator) 允许使用*对数据进行修改 3.前向迭代器(forward iterator) 输入输出迭代器的结合体,*既可以访问元素,也可以修改元素。 4.双向迭代器(bidirectional iterator) 支持–,–(int)。允许迭代器向后移动。 5.随机存取迭代器(random iterator) 迭代器的适配器 分类 插入迭代器 插入迭代器(insert_iterator) 反向插入迭代器(back_insert_iterator) 前向插入迭代器(front_insert_iterator) 反向遍历迭代器(reverse

容器、迭代器和算法

不想你离开。 提交于 2019-12-02 12:01:08
文章目录 容器、迭代器和算法 容器的实现 Java的实现方法 C++的实现方法 容器与迭代器 链表容器与迭代器 集合与迭代器 迭代器与算法 求容器中元素纸盒 微型算法库 容器和迭代器的分类 容器的陷阱 这是《深入实践C++模板编程》第五章“容器、迭代器和算法”的读书笔记。 容器、迭代器和算法 通过C++模板可以将类型以及其他编译期常数作为参数抽离出来,使代码拜托对类型依赖,从而设计容纳不同类型的容器成为可能。 容器 是指专门用于存储某种形式组织及存储的类。 容器的实现 常见的容器有数组、链表、集合、关联组等。通常语言本身会提供几种基本容器,通过这些基本容器可以组织更复杂的容器。这些容器的共同点是 可以容纳多种类型的数据 。 弱类型的动态语言,对于数据类型不敏感,其提供的类型天然支持多种数据类型。例如Python中的 list , dict , set 等,可以在同一个容器实例中保存不同类型的数据,实现异质容器。 强类型语言,变量以及函数惨了类型固定变,这是设计支持多种数据类型容器的最大障碍。C++通过模板,使得容器和算法结构不再依赖具体类型;但是这并没有实现真正支持多种类型的容器类。支持不同类型,只是生成了不同类型的容器类。 除了C++模板,其他强语言类型也有各自容器实现方法。这里介绍Java实现容器方法。 Java的实现方法 与C++相比,Java是更高级的面相对象语言

内部类迭代器

久未见 提交于 2019-12-02 12:00:53
package com.nobody.iterator; /** 基础迭代器接口 * * 迭代器用于遍历一个数据集,且在遍历过程中,可以查看、插入、删除、替换数据元素。 * 迭代器有3种类型:内部迭代器、外部迭代器和内部类迭代器 * * 内部迭代器是将迭代器的操作添加到实现了ADT(线性表等)的类中得到的,因此它可以高效的访问ADT的数据,同一时刻该迭代器对同一个线性表只允许一个迭代。 * * 外部迭代器是一个公有类的对象,该类实现了迭代器方法。这个类独立与实现了ADT的类,但与它相互作用。外部迭代器必须通过ADT的公有方法访问ADT的数据, * 因此,典型的外部迭代器会比其它种类的迭代器花更多的时间来执行操作,另外,外部迭代器允许多个迭代器各自独立遍历同一个ADT的数据。 * * 内部类迭代器是在实现了ADT的类的内部定义的内部类实例。迭代器方法实现在内部类内部,同内部迭代器一样,都可以直接访问ADT的数据,因此也同样高效, * 所付出的代价也一样,但是内部类迭代器和外部迭代器一样,都允许多个迭代器同时遍历访问同一个ADT的数据。 * * */ import java.util.NoSuchElementException; public interface BasicIteratorInterface{ /** Task: 设置迭代器初始位置于向数据集合第一个元素 */

迭代器的分类

本秂侑毒 提交于 2019-12-02 12:00:27
不同的迭代器适用于不同的容器 在c++中有两种不同的迭代器分法: 按操作分五类: 输入迭代器: (相当于读取)取出其指向的值,访问下一个元素,判断是否到达下一个元素,可以复制:*p(读取), ++p, p++; p != q, p == q 输出迭代器: (相当于输出),*p(可以修改)*p, p++, ++p, p != q, p == q 向前迭代器: 输入迭代器和输出迭代器的结合, *p既可以读取元素, 也可以修改元素 双向迭代器: 在向前迭代器的基础上更进一步, 支持p–, –p; 所以双向迭代器支持的操作有:*p, ++p, p++, p != q, p == q, p–, –p; 随机存取迭代器: 在双向迭代器的基础上, 允许随机访问序列的任意值;特点:支持算术运算和随机访问(类似数组类型), 支持符合运算 按对象分两类: const_iterator: 指向常容器的迭代器,自身是一个变量,但是指向的值不能改变 const iterator: 指向容器的常迭代器, 自身是一个常量,一旦复制,不能改变它的指向。 all 来源: CSDN 作者: danneel_zhu 链接: https://blog.csdn.net/danneel/article/details/70207463

STL源码剖析——序列式容器#2 List

妖精的绣舞 提交于 2019-12-02 11:49:32
  list就是链表的实现,链表是什么,我就不再解释了。list的好处就是每次插入或删除一个元素,都是常数的时空复杂度。但遍历或访问就需要O(n)的时间。   List本身其实不难理解,难点在于某些功能函数的实现上,例如我们会在最后讨论的迁移函数splice()、反转函数reverse()、排序函数sort()等等。 list的结点   设计过链表的人都知道,链表本身和链表结点是不一样的结构,需要分开设计,这里的list也不例外,以下是STL list的结点结构: 1 template <class T> 2 struct __list_node { 3 typedef void* void_pointer; 4 void_pointer next; 5 void_pointer prev; 6 T data; 7 };   从结点结构可以看出,list是一个双向链表,有指向前一结点的prev指针,指向下一结点的next指针。 list的迭代器   显然,list的迭代器本身是什么类型早已由其本身的数据结构所决定,list的双向链表,不支持随机存取,只能是双向迭代器(Bidirectional Iterators)。另外,list的迭代器应该支持正确的递增、递减、取值、成员取用等操作。   以下是list迭代器的源码: 1 template<class T, class Ref,

C++ STL ----- Vector

喜你入骨 提交于 2019-12-02 11:46:17
STL ● STL:序列式容器—底层为线性结构的序列式容器 String类 :专门存放 字符 的 动态的顺序表 Array:存放任意类型的静态的顺序表 C++11 (了解) Vector :存放 任意类型 的 动态的顺序表 (更看重于用数组来维护) Forward_list:带头结点的循环单链表 C++11(单链表用的不多,了解接口即可) List :存放任意类型的数据---- 带头结点的双向循环链表 Deque:动态的二维数组 (用的比较少) ● 特殊容器: Stack:栈 Queue:队列 ● 迭代器 :方便用户便利的容器-------好处:可以不用知道容器底层的数据结构 C++:string::iterator-------------》char* Vector::iterator--------》T* String VS vector 1.array 定义的时候 必须定义数组的元素个数 ;而vector不需要;且只能包含整型字面值常量,枚举常量或者用常量表达式初始化的整型const对象,非const变量以及需要到运行阶段才知道其值的const变量都不能用来定义数组的维度。 2.array 定义后的空间 是固定的了,不能改变;而vector要灵活得多,可再加或减。 3.vector有一系列的 函数操作 ,非常方便使用; array 不提供push

迭代器方法

青春壹個敷衍的年華 提交于 2019-12-02 06:39:11
for var array = [1,2,3,4,5,6,7]; for (var i = 0; i < array.length; i) { console.log(i,array[i]); } for in for(let index in array) { console.log(index,array[index]); }; var A = {a:1,b:2,c:3,d:"hello world"}; for(let k in A) { console.log(k,A[k]); } forEach array.forEach(v=>{ console.log(v); }); array.forEach(function(v){ console.log(v); }); for of for(let v of array) { console.log(v); }; let s = "helloabc"; for(let c of s) { console.log(c); } 来源: https://blog.csdn.net/Fanstasic/article/details/93888333