迭代器

JAVA常见容器

こ雲淡風輕ζ 提交于 2019-12-03 01:27:30
本文主要介绍JAVA中常见容器间的关系和主要区别。JAVA中的容器种类很多,且各有特点。为此特意进行学习研究,写下此文,作为一点总结。若有错误,欢迎拍砖。 上图是JAVA常见的各个容器的继承关系,我们就顺着继承关系说一下各个接口或者类的特点吧。 Iterable 接口 Iterable是一个超级接口,被Collection所继承。它只有一个方法: Iterator<T> iterator() //即返回一个迭代器 迭代器是一种设计模式,它是一个对象,它可以遍历并选择序列中的对象,而开发人员不需要了解该序列的底层结构。迭代器通常被称为**“轻量级”**对象,因为创建它的代价小。 Java中的Iterator功能比较简单,并且只能 单向移动 :   (1) 使用方法iterator()要求容器返回一个Iterator。第一次调用Iterator的next()方法时,它返回序列的第一个元素。注意:iterator()方法是java.lang.Iterable接口,被Collection继承。   (2) 使用next()获得序列中的下一个元素。   (3) 使用hasNext()检查序列中是否还有元素。   (4) 使用remove()将迭代器新返回的元素删除。 Iterator是Java迭代器最简单的实现,为List设计的ListIterator具有更多的功能,它可以从 两个方向

集合框架、单列集合体系、Collection、Iterator迭代器、泛型、上限&amp;下限【学习笔记】

匿名 (未验证) 提交于 2019-12-03 00:42:01
一、单列集合 1.单列集合体系 Collection List Set ArrayList LinkedList HashSet LinkedHashSet List :存取有序、有索引、还可以存储重复的元素 ArrayList:底层是数组实现的,有索引,查询快、增删慢 LinkedList:底层是链表实现的,有索引,查询慢、增删快 Set : 存取无序、没有索引、不可以存储重复的元素 HashSet:底层是哈希表+红黑树的,存取无序、没有索引、不可以存储重复的元素 LinkedHashSet:底层是链表+哈希表实现的,可以保证存取顺序,没有索引、不可以存储重复的元素 2.Collection接口中的共性的功能 boolean add(E e); 向集合中添加元素 void clear(); 清空集合所有的元素 boolean remove(E e); 删除指定的元素 boolean contains(E e); 判断集合中是否包含传入的元素 boolean isEmpty(); 判断集合是否为空 int size(); 获取集合的长度 Object[] toArray(); 将集合转成数组 示例代码: public class Demo01Collection { public static void main (String[] args) { //创建集合对象,可以使用多态

CPP strings 与标准模板库

匿名 (未验证) 提交于 2019-12-03 00:41:02
Leetcode 838 push dominos 解体思路 */ /*--> */ /*--> */ /*--> */ /*--> */ STL标准模板库 提供了一组表示容器、迭代器、函数对象和算法的模板。 Alex Stepanov & Meng Lee 一起开发了STL, 1994年第一版发布。STL不是面向对象的编程,而是一种不同的编程模式---泛型编程(generic programming)。 前者关注的是 编程的数据方面 ,后者关注的是 算法 。共同特点是 抽象与创建可重用代码 ,但理念决然不同。 容器 所有的STL容器都提供了一些基本方法,包括size(), swap, begin, end:后面两个返回指向容器的第一个与尾部的迭代器(一种广义指针)。 每一个容器类都定义了一个合适的迭代器,该迭代器的类型是一个名为iterator的typedef. 比如: vector::iterator pd = scores.begin(); C++ 11的自动推断也可以用在这里: auto pd = scores.begin(); 几个有意思的操作 for_each() / random_shuffle() / sort() . random_shuffle(books.begin(), books.end()) 随机排列区间中的元素。 泛型编程 泛型编程旨在

STL֮list

匿名 (未验证) 提交于 2019-12-03 00:37:01
之前手撕过用C语言写的bclist,双向循环列表,也就是STL中的list,list的操作也就是插入和删除稍微麻烦一点,细心一点的话,这些都没什么太大问题的。 list中的迭代器是双向迭代器,list的插入和删除不会造成原有的迭代器失效,vector由于有生长的过程,因此,插入元素可能回导致所有的迭代器都失效,list删除元素会导致被指向的那个迭代器失效,其他迭代器是不受影响的。 STL֮list 原文:https://www.cnblogs.com/randyniu/p/9235722.html

C++函数模板 和 迭代器

匿名 (未验证) 提交于 2019-12-03 00:34:01
#include <iostream> #include <vector> using namespace std ; //template <class T> template < typename T > //typename是为了避免class混淆 T sum ( T a , T b ) //函数模板 { return a + b ; } int main ( void ) { cout << sum ( 3 , 5 )<< endl ; cout << sum ( 3.3 , 5.0 )<< endl ; //迭代器 vector <string> vec ; vec . push_back ( "zs" ); vector <string> :: iterator i = vec . begin (); //i的数据类型死vector<string> for (; i != vec . end (); i ++) { cout <<* i << endl ; } return 0 ; } 转载请标明出处: C++函数模板 和 迭代器 文章来源: C++函数模板 和 迭代器

11.迭代器与生成器、模块与包

匿名 (未验证) 提交于 2019-12-03 00:32:02
1.迭代器和生成器 迭代器 迭代器对象要求支持迭代器协议的对象,在Python中,支持迭代器协议就是实现对象的__iter__()和__next__()方法。 其中__iter__()方法返回迭代器对象本身;__next__()方法返回容器的下一个元素,在结尾时引发StopIteration异常。 # 迭代器 iterator li = [1,2 ] del li li = [] # #for i in range(11): # # if i%2==0: # # li.append(i) for i in range(0,11,2 ): li.append(i) class TupleIter: def __init__ (self,li): self.li = li self._index = 0 def __iter__ (self): return self def __next__ (self): if self._index < len(self.li): index = self.li[self._index] self._index += 1 return index else : raise StopIteration tu = TupleIter((1,2,3,4,5)) 生成器 在Python中,使用生成器可以很方便的支持迭代器协议。 生成器通过生成器函数产生

迭代器失效问题

匿名 (未验证) 提交于 2019-12-03 00:32:02
在前面我们实现了vector和list 不管是库里面的使用 还是我们自己模拟实现的版本 今天来看一个关于容器容易出现的问题,迭代器失效问题 如果我们有如下要求,在一个list中,我们要求只将值为偶数的节点删除掉。 我们就实现如下代码: void test_iterator_invalid() { list < int > L; L.push_back( 1 ); L.push_back( 2 ); L.push_back( 3 ); L.push_back( 4 ); L.push_back( 5 ); //利用模板数打印list中的内容 PrintContainers(L); //要求只是删除值为偶数的节点 list < int > ::iterator it1=L.begin(); while (it1!=L.end()) { if (*it1% 2 == 0 ) //为偶数 { L.erase(it1); } it1++; } cout <<endl; printf ( "删除值为偶数的节点\n" ); PrintContainers(L); } 上面的代码 我们看上去没有什么问题,但是运行之后会崩掉 此处不上传崩溃的截图 分析原因: list的迭代器失效是因为在进行erase()之后,节点被释放,但是当前迭代器还是指向该节点,node 节点已经被释放,node-

filter过滤器

匿名 (未验证) 提交于 2019-12-03 00:30:01
# filter(fun,iterable) 内置函数,不需要导入 #fun 功能函数,参数需要满足的条件 #irerable 迭代器,需要过滤的多个参数 #作用:将迭代器中的每个函数取出来,执行fun,根据该函数的返回值决定是否保留(True),不保留(False) #例子:去掉1-100之间的偶数 list1 = range(1,101) #生成1-100之间的所有整数 #定义一个函数 文章来源: filter过滤器

TensorFlow导入数据(tf.data)

匿名 (未验证) 提交于 2019-12-03 00:30:01
上一篇 介绍了TensorFlow读取数据的四种方法:tf.data、Feeding、QueueRunner、Preloaded data。 本篇的内容主要介绍 tf.data API的使用 Ŀ¼ 基于 tf.data API,我们可以使用简单的代码来构建复杂的输入 pipeline。 (例1,从分布式文件系统中读取数据、进行预处理、合成为 batch、训练中使用数据集;例2,文本模型的输入 pipeline 需要从原始文本数据中提取符号、根据对照表将其转换为嵌入标识符,以及将不同长度的序列组合成batch数据等。) 使用 tf.data API 可以轻松处理大量数据、不同的数据格式以及复杂的转换。 tf.data API 在 TensorFlow 中引入了 两个新概念 : tf.data.Dataset :表示一系列元素,其中每个元素包含一个或多个 Tensor 对象。例如,在图片管道中,一个元素可能是单个训练样本,具有一对表示图片数据和标签的张量。可以通过两种不同的方式来创建数据集。 1 直接从 Tensor 创建 Dataset (例如 Dataset.from_tensor_slices() );当然 Numpy 也是可以的,TensorFlow 会自动将其转换为 Tensor。 2 通过对一个或多个 tf.data.Dataset 对象来使用变换(例如 Dataset

ES6 迭代器

匿名 (未验证) 提交于 2019-12-03 00:29:01
1、ES6实现的是为迭代器引入一个隐式的标准化接口。 2、为了达到最大化的互操作性,也可以自己构建符合这个标准的迭代器。 3、迭代器是一种有序的、连续的、基于拉取的用于消耗数据的组织方式。 4、接口 Iterator [required] next() {method}: 取得下一个IteratorResult Iterator [optional] return () {method} : 停止迭代器并返回IteratorResult throw() {method} :报错并返回IteratorResult IteratorResult 接口指定如下 IteratorResult value {property} : 当前迭代值或者最终返回值(如果undefined为可选的) done {property} : 布尔值,指示完成状态 IteratorResult 接口指定了从任何迭代器操作返回的值必须是下面这种形式的对象: { value : .., done : true / false } Iterable @@iterator() {method} : 产生一个 Iterator @@iterator是一个特殊的内置符号,表示可以为这个对象产生迭代器的方法 5、next() 迭代 next()调用越过数组结尾的值,才能得到完成信号 done: true。 var arr