迭代器

再探迭代器(插入迭代器、流迭代器、反向迭代器、移动迭代器)

ⅰ亾dé卋堺 提交于 2019-11-28 20:02:45
除了为每个容器定义的迭代器之外,标准库在头文件iterator中还定义了额外几种迭代器。这些迭代器包括以下几种。 插入迭代器:这些迭代器被绑定到一个容器上,可用来向容器插入元素 流迭代器:这些迭代器被绑定到输入或输出上,可用来遍历所有关联的IO流 反向迭代器:这些迭代器向后而不是向前移动。除了forward_list之外的标准库容器都有反向迭代器 移动迭代器:这些专用的迭代器不是拷贝其中的元素,而是移动它们。 1 插入迭代器 插入器是一种迭代器适配器,它接受一个容器,生成一个迭代器,能实现向给定容器添加元素。当我们通过一个迭代器进行赋值时,该迭代器调用容器操作来向给定容器的指定位置插入一个元素。下表列出了这种迭代器支持的操作。 插入迭代器操作 it=t           在it指定的当前位置插入值t。假定c是it绑定的容器,依赖于插入迭代器的不同种类,此赋值分别调用c.push_back(t)、c.push_front(t)或c.insert(t,p),其中p为传递给inserter的迭            代器位置 *it,++it,it++        这些操作虽然存在,但不会对it做任何事情。每个操作都返回it 插入迭代器有三种类型,差异在于元素插入的位置: back_inserter创建一个使用push_back的迭代器 front

插入迭代器

◇◆丶佛笑我妖孽 提交于 2019-11-28 20:01:40
transform: 通过transform函数我们可以将一个仿函数作用域[begin,last)的每个元素身上,然后将结果保存到目标区间。 vector<int> results; transform(value.begin(),value.end(),results.end(),transmogrify()); 上述代码会将value中的元素调用transmogrify,然后通过赋值保存到results中。 但是这会出现一些问题, 因为results中没有对象,怎么可能赋值成功 。 当然可以考虑先默认构造然后在使用transform。 front_inserter/back_inserter: front_inserter/back_inserter可以和容器进行绑定,通过此迭代器进行赋值的时候会调用push_back()/push_front(); vector<int> results; transform(value.begin(),value.end(),back_inserter(results),transmogrify()); 如此,transform最后对back_inserter进行赋值的时候,便会调用results的push_back()。不用担心 是否已经分配内存,构造对象。 除此之外: 还有一个inserter可以在指定位置进行插入

生成器、迭代器、三元表达式和匿名函数等

谁说胖子不能爱 提交于 2019-11-28 20:01:29
一、迭代器 什么是迭代器 ?      迭代器是一个可以记住遍历的位置的对象。 迭代器对象从集合的第一个元素开始访问,直到所有的元素被访问完结束。 迭代器只能往前不会后退 。 迭代器有两个基本的方法: iter() 和 next() 。 字符串,列表或元组对象都可用于创建迭代器: 可迭代对象和迭代器对象 可迭代对象指内置方法中有__iter__的对象,如列表,元组,字典,集合,字符串,打开的文件对象 迭代器对象是有可迭代对象通过调用其__iter__方法(实际上就是(iter(obj))得到的对象,迭代器对象内置方法中有__iter__和__next__方法,其中__next_方法就是执行迭代器对象的下一个值,需要注意的是,当迭代器对象中的值全部取出来之后,里面就没有元素了,再使用___next__会产生异常,所以迭代器对象只能拿取一次    list1 = [1, 2, 3] list_iter = list1.__iter__() print(list_iter.__next__()) print(list_iter.__next__()) print(list_iter.__next__()) print(list_iter.__next__()) """ 1 Traceback (most recent call last): 2 3 File "C:/Users

迭代器

寵の児 提交于 2019-11-28 19:50:02
什么是迭代器? 迭代是一个重复的过程,每次重复即以此迭代,并且每次迭代的结果都是下一次迭代的初始值   1、为何要有初始值:     对于序列类型、字符串、列表、元组,我i们可以使用索引的方式迭代取出其包含的元素;但对于字典、集合、文件等类型的时没有索引的,若还想去除内部包含的元素,则必须找到一中不依赖索引的迭代方式,这就是迭代器   2、什么是可迭代对象:     可迭代对象指的是内置有__iter__()方法的对象,即obj.__iter__()   3、什么是迭代器对象:     可迭代对象执行 obj,.__iter__() 得到的结果就是迭代器对象,而迭代器对象指的是即内置有__iter__() 有内置有 __next__方法的对象   4、文件类型四迭代对象     open('a.txt')..__iter__()     open('a.txt').__next__() 优点:   1、提供一种统一的、不依赖于索引的迭代方式   2、惰性计算,节省内存 缺点:   1、无法获取长度(只有在 next 完毕才知道到底有几个值)     2、一次性的,只能往后走,不能往前回退 再论 for 循环   for 循环工作原理:     1、执行 in 后对象的 dic.__iter__() 方法,得到一个迭代对象 iter_dic     2、执行 next(iter

C#迭代器——由foreach说开去

痴心易碎 提交于 2019-11-28 19:27:14
原文链接: https://blog.csdn.net/u013477973/article/details/65635737 C#迭代器——由foreach说开去 foreach在数组集合的遍历时会被经常用到,例如: string[] strs = new string[] { "red", "green","blue" }; foreach (var item in strs) { Console.WriteLine(item); } 1 2 3 4 5 使用foreach做遍历确实很方便,然而并不是每一种类型都能使用foreach进行遍历操作,只有实现了IEnumerable接口的类(也叫做可枚举类型)才能进行foreach的遍历操作,集合和数组已经实现了这个接口,所以能进行foreach的遍历操作 IEnumerable和IEnumerator IEnumerable叫做可枚举接口,它的成员只有一个 GetEnumerator() 返回一个枚举器对象,即实现了IEnumerator接口的类的实例,实现IEnumerator接口的枚举器包含3个函数成员: Current属性 MoveNext()方法 Reset()方法 Current属性为只读属性,返回枚举序列中的当前位置,MoveNext()把枚举器的位置前进到下一项,返回布尔值,新的位置若是有效的,返回true

LC 752 Open the Lock (未完成)

◇◆丶佛笑我妖孽 提交于 2019-11-28 19:12:11
由于这个问题,涉及了很多知识,例如数据结构里面的哈希表,c++中的迭代器,因此,需要对于每一个疑惑逐一击破。 问题描述 参考答案 1 class Solution { 2 public: 3 int openLock(vector<string>& deadends, string target) { 4 unordered_set<string> dds(deadends.begin(), deadends.end()); 5 unordered_set<string> visited; 6 queue<string> bfs; 7 string init = "0000"; 8 if (dds.find(init) != dds.end()) return -1; 9 visited.insert("0000"); 10 bfs.push("0000"); 11 int res = 0; 12 while (!bfs.empty()) { 13 int sz = bfs.size(); 14 for (int i = 0; i < sz; i++) { 15 string t = bfs.front(); bfs.pop(); 16 vector<string> nbrs = move(nbrStrs(t)); 17 for (auto s : nbrs) { 18 if (s

set容器

二次信任 提交于 2019-11-28 18:20:52
set容器简介: 1) set是一个 集合 容器,其中所包含的元素是 唯一 的, 集合中的元素按一定的顺序排列 。 元素插入过程是按排序规则插入 ,所以不能指定插入位置。 2) set采用 红黑树 变体的数据结构实现,红黑树属于平衡二叉树。在插入操作和删除操作上比vector快。 3) set不可以直接存取元素。(不可以使用at.(pos)与[]操作符)。 4) multiset与set的区别:set支持唯一键值,每个元素值只能出现一次;而multiset中 同一值可以出现多次 。 5) 不可以直接修改set或multiset容器中的元素值,因为该类容器是自动排序的。如果希望修改一个元素值,必须先删除原有的元素,再插入新的元素。 (红黑树的变体,查找效率高,插入不能指定位置,插入时自动排序) set/multiset对象的默认构造 set<int> setInt; //一个存放int的set容器。 set<float> setFloat; //一个存放float的set容器。 set<string> setString; //一个存放string的set容器。 multiset<int> mulsetInt; //一个存放int的multi set容器。 multi set<float> multisetFloat; //一个存放float的multi set容器。 multi

Java 迭代接口:Iterator、ListIterator 和 Spliterator

拟墨画扇 提交于 2019-11-28 17:22:24
1. 简介 当我们使用 for 或 while 循环来遍历一个集合的元素, Iterator 允许我们不用担心索引位置,甚至让我们不仅仅是遍历一个集合,同时还可以改变它。例如,你如果要删除循环中的元素,那么 for 循环不见得总是可行的。 结合自定义的迭代器,我们可以迭代更为复杂的对象,以及向前和向后移动,并且知晓如何利用其优势也将变得非常清楚。 本文将深入讨论如何使用 Iterator 和 Iterable 接口。 2. Iterator() Iterator 接口用于迭代集合中的元素( List , Set 或 Map )。它用于逐个检索元素,并在需要时针对每个元素执行操作。 下面是用于遍历集合与执行操作的方法: .hasNext() :如果还没有到达集合的末尾,则返回 true ,否则返回 false .next() :返回集合中的下一个元素 .remove() :从集合中移除迭代器返回的最后一个元素 .forEachRemaining() :按顺序为集合中剩下的每个元素执行给定的操作 首先,由于迭代器是用于集合的,让我们做一个简单的包含几个元素的 ArrayList : List<String> avengers = new ArrayList<>(); // Now lets add some Avengers to the list avengers.add("Ant

Python之函数(六)迭代器与递归

我们两清 提交于 2019-11-28 16:19:59
4.8 迭代器 可迭代对象 # 迭代: 器:工具 # 可迭代对象 # list,dict,str,set,tuple -- 可迭代对象 使用灵活 #迭代对象判断 #方式一 #对象具有__iter__()方法则为迭代对象 #方式二 #查看源码 CTRL+鼠标左键 #方式三 #print(dir(list)) 查看是否有__iter__()方法 #官方声明只要具有__iter__()方法的就是可迭代对象 #可迭代对象的优点: # 使用 灵活 # 直接查看值 #可迭代对象的缺点: #占位内存 #取值方式: #list str tuple --索引 #dict --键 #set -- 直接取值 迭代器 #官方声明只要具有__iter__()方法__next__()方法就是迭代器 f = open("xxxx","w") f.__iter__() f.__next__() lst=[1,2,3] new_lst=lst.__iter__()#将可迭代对象转换成迭代器 new_lst.__iter__() new_lst.__next__() for循环的本质 s="123" count=len(s) new_s=s.__iter__() while count: print(new_s.__next__()) count-=1 #结果为:3 2 1 #for 循环真实本质 s="123"

迭代器和生成器

你说的曾经没有我的故事 提交于 2019-11-28 15:59:24
迭代器实现 # for 循环遍历列表、元组和字典等,这些对象都是可迭代的,因此它们都属于迭代器 '''__iter__(self):该方法返回一个迭代器(iterator),迭代器必须包含一个__next__()方法, 该方法返回迭代器的下一个元素。''' """__reversed__(self):该方法主要为内建的 reversed() 反转函数提供支持, 当程序调用 reversed() 函数对指定迭代器执行反转时,实际上是由该方法实现的。""" # 定义一个代表斐波那契数列的迭代器 class Fibs: def __init__(self, len): self.first = 0 self.sec = 1 self.__len = len # 定义迭代器所需的__next__方法 def __next__(self): # 如果__len__属性为0,结束迭代 if self.__len == 0: raise StopIteration # 完成数列计算: self.first, self.sec = self.sec, self.first + self.sec # 数列长度减1 self.__len -= 1 return self.first # 定义__iter__方法,该方法返回迭代器 def __iter__(self): return self #