迭代器

STL迭代器

牧云@^-^@ 提交于 2020-01-07 04:22:33
【推荐】2019 Java 开发者跳槽指南.pdf(吐血整理) >>> 以下内容大多来自《C++标准程序库》 迭代器是一个“可遍历STL容器内全部或部分元素”的对象,一个迭代器用来指出容器中的一个特定位置。 基本操作: (1)Operator * :返回当前位置上的元素值 (2)Operator ++:将迭代器前进至下一个元素,大多数迭代器还可以使用operator -- 退回到前一个元素 (3)Operator ==和Operator != 判断两个迭代器是否指向同一个位置 (4)Operator = 为迭代器赋值 这些操作与操作数组元素时的指针接口是一致的,不同在于迭代器具有遍历复杂数据结构的能力,其下层运行机制取决于其所遍历的数据结构,因此,每一种容器型别都必须提供自己的迭代器。事实上每一种容器都将其迭代器以嵌套方式定义于内部,因此各种迭代器的接口相同,型别却不相同。 重要函数 所有容器类别都提供有一些成员函数,使我们得以获得迭代器并一直遍访所有元素。 begin() 返回一个迭代器,指向容器起始点的位置 end() 返回一个迭代器,指向容器结束点。结束点在最后一个元素之后,这样的迭代器又称作逾尾(past-the-end)迭代器(所以遍历的时候都是判断!=end()) #include <iostream> #include <list> using namespace

Java入门(三)——集合概讲

痴心易碎 提交于 2020-01-07 03:05:11
集合(或者叫容器)是Java的核心知识点,它有着很深的深度。我们这里不会设计多深,仅仅作为了解入门,深入了解请移步各种集合源码文章。好的,下面正是开始介绍... Java集合为何而生 我们知道,Java是一门面向对象编程语言,这也就意味着程序中存在着大量的对象。这个时候问题就来了,我们如何很好的存放和操作对象呢?如果你能明白这个问题,那么你就知道了“集合为何而生”这个问题的答案。 总结一句: Java给我们提供了工具(集合)方便我们去存放和操作多个Java对象 Java集合入门学习 Java集合的目的是方便操作多个对象,同时,它提供一系列的API来供我们操作。因此,在初学Java集合的时候我们更多的是 学习这些API的用法 。 对Java集合的API使用有一定了解之后,我们就应该从 面向对象 的角度去理解它。为什么会抽象出多个接口,以及每个接口有什么特征。 我们可以总结出几个常用的实现类,这几个常用的实现类我们必须知道它的数据结构是什么,什么时候使用这个类。 同时,你还需要学习和了解数据结构: 学完上面的内容后,我们基本掌握了常用集合的数据结构,也就知道了如何选择合适的集合容器去存储我们的对象。总之, 学完常见实现类的数据结构之后,对它们的使用场景也有了更加清晰的认识 。 Java集合类简介 Java集合是一个很庞大的知识点,话不多说,上图感受下: Java集合的

python迭代器详解

雨燕双飞 提交于 2020-01-05 07:09:06
迭代器 迭代是访问集合元素的一种方式。迭代器是一个可以记住遍历的位置的对象。迭代器对象从集合的第一个元素开始访问,直到所有的元素被访问完结束。迭代器只能往前不会后退。 1. 可迭代对象 我们已经知道可以对list、tuple、str等类型的数据使用for...in...的循环语法从其中依次拿到数据进行使用,我们把这样的过程称为遍历,也叫 迭代 。 但是,是否所有的数据类型都可以放到for...in...的语句中,然后让for...in...每次从中取出一条数据供我们使用,即供我们迭代吗? >>> for i in 100:... print(i)...Traceback (most recent call last): File "<stdin>", line 1, in <module>TypeError: 'int' object is not iterable>>># int整型不是iterable,即int整型不是可以迭代的​# 我们自定义一个容器MyList用来存放数据,可以通过add方法向其中添加数据>>> class MyList(object):... def __init__(self):... self.container = []... def add(self, item):... self.container.append(item)...>>>

转:STL提供了三个最基本的容器:vector,list,deque

狂风中的少年 提交于 2020-01-05 05:41:00
vector和built-in数组类似,它拥有一段连续的内存空间,并且起始地址不变,因此它能非常好的支持随机存取,即[]操作符,但由于它的内存空间是连续的,所以在中间进行插入和删除会造成内存块的拷贝,另外,当该数组后的内存空间不够时,需要重新申请一块足够大的内存并进行内存的拷贝。这些都大大影响了vector的效率。 list就是数据结构中的双向链表(根据sgi stl源代码),因此它的内存空间可以是不连续的,通过指针来进行数据的访问,这个特点使得它的随机存取变的非常没有效率,因此它没有提供[]操作符的重载。但由于链表的特点,它可以以很好的效率支持任意地方的删除和插入。 deque是一个double-ended queue,它的具体实现不太清楚,但知道它具有以下两个特点:它支持[]操作符,也就是支持随即存取,并且和vector的效率相差无几,它支持在两端的操作:push_back、push_front、pop_back、pop_front等,并且在两端操作上与list的效率也差不多。 因此在实际使用时,如何选择这三个容器中哪一个,应根据你的需要而定,一般应遵循下面的原则: 1、如果你需要高效的随即存取,而不在乎插入和删除的效率,使用vector 2、如果你需要大量的插入和删除,而不关心随即存取,则应使用list 3、如果你需要随即存取,而且关心两端数据的插入和删除,则应使用deque

vector容器的用法

强颜欢笑 提交于 2020-01-05 05:28:00
转自一篇博客^-^: 1 基本操作 (1)头文件#include<vector>. (2)创建vector对象,vector<int> vec; (3)尾部插入数字:vec.push_back(a); (4)使用下标访问元素,cout<<vec[0]<<endl;记住下标是从0开始的。 (5)使用迭代器访问元素. vector<int>::iterator it; for(it=vec.begin();it!=vec.end();it++) cout<<*it<<endl; (6)插入元素: vec.insert(vec.begin()+i,a);在第i+1个元素前面插入a; (7)删除元素: vec.erase(vec.begin()+2);删除第3个元素 vec.erase(vec.begin()+i,vec.end()+j);删除区间[i,j-1];区间从0开始 (8)向量大小:vec.size(); (9)清空:vec.clear(); 2 vector的元素不仅仅可以使int,double,string,还可以是结构体,但是要注意:结构体要定义为全局的,否则会出错。下面是一段简短的程序代码: #include<stdio.h> #include<algorithm> #include<vector> #include<iostream> using namespace

java容器

試著忘記壹切 提交于 2020-01-05 02:31:01
Collection容器 所有容器的父接口 容器可以存储任意类型的数据 内部存储的是地址 容器只能存储引用数据类型的数据(数据需要通过自动装箱实现) Collection的子接口包括List接口和set接口 格式 Collection 引用= new 子容器() 方法 迭代 iterator() 获取迭代器 增 add(Object) 增加指定元素 addAll(Collection) 将子容器的内容全部加入 删 remove(Object) 移除指定元素,只移除存储位置最前的一个 removeAll(Collection) 将子容器的内容移除 clear() 清空容器 retain(Collection) 获取交集return交集的容器 查 contain(Object) 查找单个元素 containAll(Collection) 查找子容器 size() 查找长度 判断 isEmpty() 判断是否为空 equals(Collection) 比较 转换 toArray() 转换为数组 遍历 增强for|for…each For(元素类型 引用: 容器){操作 } 迭代器 范型 在定义容器和迭代器时添加<>类型标签 Collectin<范型> 引用=new 子容器<范型>() Iterator<范型> 引用=容器.iterator() 迭代器 Iterator迭代器接口 定义获取

Java入门(三)——集合概讲

不打扰是莪最后的温柔 提交于 2020-01-04 18:24:45
集合(或者叫容器)是Java的核心知识点,它有着很深的深度。我们这里不会设计多深,仅仅作为了解入门,深入了解请移步各种集合源码文章。好的,下面正是开始介绍... Java集合为何而生 我们知道,Java是一门面向对象编程语言,这也就意味着程序中存在着大量的对象。这个时候问题就来了,我们如何很好的存放和操作对象呢?如果你能明白这个问题,那么你就知道了“集合为何而生”这个问题的答案。 总结一句: Java给我们提供了工具(集合)方便我们去存放和操作多个Java对象 Java集合入门学习 Java集合的目的是方便操作多个对象,同时,它提供一系列的API来供我们操作。因此,在初学Java集合的时候我们更多的是 学习这些API的用法 。 对Java集合的API使用有一定了解之后,我们就应该从 面向对象 的角度去理解它。为什么会抽象出多个接口,以及每个接口有什么特征。 我们可以总结出几个常用的实现类,这几个常用的实现类我们必须知道它的数据结构是什么,什么时候使用这个类。 同时,你还需要学习和了解数据结构: 学完上面的内容后,我们基本掌握了常用集合的数据结构,也就知道了如何选择合适的集合容器去存储我们的对象。总之, 学完常见实现类的数据结构之后,对它们的使用场景也有了更加清晰的认识 。 Java集合类简介 Java集合是一个很庞大的知识点,话不多说,上图感受下: Java集合的

Java入门(三)——集合概讲

℡╲_俬逩灬. 提交于 2020-01-04 03:25:24
集合(或者叫容器)是Java的核心知识点,它有着很深的深度。我们这里不会设计多深,仅仅作为了解入门,深入了解请移步各种集合源码文章。好的,下面正是开始介绍... Java集合为何而生 我们知道,Java是一门面向对象编程语言,这也就意味着程序中存在着大量的对象。这个时候问题就来了,我们如何很好的存放和操作对象呢?如果你能明白这个问题,那么你就知道了“集合为何而生”这个问题的答案。 总结一句: Java给我们提供了工具(集合)方便我们去存放和操作多个Java对象 Java集合入门学习 Java集合的目的是方便操作多个对象,同时,它提供一系列的API来供我们操作。因此,在初学Java集合的时候我们更多的是 学习这些API的用法 。 对Java集合的API使用有一定了解之后,我们就应该从 面向对象 的角度去理解它。为什么会抽象出多个接口,以及每个接口有什么特征。 我们可以总结出几个常用的实现类,这几个常用的实现类我们必须知道它的数据结构是什么,什么时候使用这个类。 同时,你还需要学习和了解数据结构: 学完上面的内容后,我们基本掌握了常用集合的数据结构,也就知道了如何选择合适的集合容器去存储我们的对象。总之, 学完常见实现类的数据结构之后,对它们的使用场景也有了更加清晰的认识 。 Java集合类简介 Java集合是一个很庞大的知识点,话不多说,上图感受下: Java集合的

pytorch :: Dataloader中的迭代器和生成器应用

拈花ヽ惹草 提交于 2020-01-03 10:38:29
在使用pytorch训练模型,经常需要加载大量图片数据,因此pytorch提供了好用的数据加载工具Dataloader。 为了实现小批量循环读取大型数据集,在Dataloader类具体实现中,使用了迭代器和生成器。 这一应用场景正是python中迭代器模式的意义所在,因此本文对Dataloader中代码进行解读,可以更好的理解python中迭代器和生成器的概念。 本文的内容主要有: 解释python中的迭代器和生成器概念 解读pytorch中Dataloader代码,如何使用迭代器和生成器实现数据加载 python迭代基础 python中围绕着迭代有以下概念: 可迭代对象 iterables 迭代器 iterator 生成器 generator 这三个概念互相关联,并非孤立。在可迭代对象的基础上发展了迭代器,在迭代器的基础上又发展了生成器。 学习这些概念的名词解释没有多大意义。编程中很多的抽象概念都是为了更好的实现某些功能,才去人为创造的协议和模式。 因此,要理解它们,需要探究概念背后的逻辑,为什么这样设计?要解决的真正问题是什么?在哪些场景下应用是最好的? 迭代模式首先要解决的基础问题是,需要按一定顺序获取集合内部数据,比如循环某个list。 当数据很小时,不会有问题。但当读取大量数据时,一次性读取会超出内存限制,因此想出以下方法: 把大的数据分成几个小块,分批处理

Python核心编程的四大神兽:迭代器、生成器、闭包以及装饰器

北战南征 提交于 2020-01-02 01:09:13
生成器 生成器是生成一个值的特殊函数,它具有这样的特点:第一次执行该函数时,先从头按顺序执行,在碰到yield关键字时该函数会暂停执行该函数后续的代码,并且返回一个值;在下一次调用该函数执行时,程序将从上一次暂停的位置继续往下执行。 通过一个例子来理解生成器的执行过程。求1-10的所有整数的立方并将结果打印输出,正常使用列表的实现如下: 输出结果如下: 当数据量很少时,可以很快得到结果。但是如果范围扩大到10000甚至是100000000,就会发现程序执行时间会变长,变卡,甚至有可能会因超出内存空间而出现程序崩溃的现象。这是因为当数据量变得非常大的时候,内存需要开辟很大的空间去存储这些数据,内存都被吃了,自然会变慢变卡。使用生成器就能解决这个问题。 对于上述同一个问题用生成器实现如下,将范围扩大到1-10000000: 执行效果如下: 可以看到没有任何的结果输出,这说明程序已经可以顺利执行。对于迭代器来讲需要用next()方法来获取值,修改主函数为以下情况可以打印输出前4个整数的立方数: 输出结果如下: 到此可以看到,生成器生成的值需要使用next()方法一个一个的取,它不会一次性生成所有的计算结果,只有在取值时才调用,这时程序会返回计算的一个值且程序暂停;下一次取值时从上一次中断了的地方继续往下执行。 以取出前3个值为例,下图为生成器代码解析图: 图解