迭代器

【C++容器和string类】vector、stack、queue、string

断了今生、忘了曾经 提交于 2020-02-29 10:39:11
目录 vector stack queue string vector 头文件: #include<vector> 1. 创建普通变量 vector<int> x(v[1]); //用v[1]初始化 vector<int> y=v[2]; //用v[2]初始化 vextor<string> sevc{"vb","vc"}; //字符串初始化 2. 指定数量的元素 vector<int> ivec(10,-1); //10个int元素,每个都初始化为-1,若不指定-1则均初始化为0; vector<string> svec(10,"hello") ; //均已“hello”初始化 3. 创建二维数组 vector<vector<ing>> arr(2,vector<int>(5)); //相当于二维数组a[2][5]; vector<int> V[10]; //表示10个容器 4. 迭代器,相当于指针 vector<int>::iterator it; //it读写vector<int>中的元素 string::iterator st; //读写string对象中的字符 vector<int>::const_iterator it2; //it2只能读元素,不能写元素 string::const_iterator it3; //it3只能读字符,不能写字符 使用方法eg: int a

STL源码剖析(deque)

夙愿已清 提交于 2020-02-29 03:04:58
deque是一个双向开口的容器,在头尾两端进行元素的插入跟删除操作都有理想的时间复杂度。 deque使用的是分段连续线性空间,它维护一个指针数组(T** map),其中每个指针指向一块连续线性空间。 (map左右两边一般留有剩余空间,用于前后插入元素,具体下面可以看到其实现) 根据上图,可以了解到deque的迭代器的基本定义。 1 template <class T, class Ref, class Ptr, size_t BufSiz> 2 struct __deque_iterator { 3 // 基本型别的定义 4 typedef __deque_iterator<T, T&, T*, BufSiz> iterator; 5 typedef random_access_iterator_tag iterator_category; 6 typedef T value_type; 7 typedef Ptr pointer; 8 typedef Ref reference; 9 typedef size_t size_type; 10 typedef ptrdiff_t difference_type; 11 typedef T** map_pointer; 12 typedef __deque_iterator self; 13 14 // 缓冲区的大小 15 tatic

Lua 笔记--迭代器与泛型for

岁酱吖の 提交于 2020-02-29 01:53:35
所谓“迭代器”就是一种可以遍历一种集合中所有元素的机制。在Lua中,通常将迭代器表示为函数。每调用一次函数,即返回集合中的“下一个”元素。 function values(t) local i = 0 return function() i = i + 1 return t[i] end end 在上例中,values就是一个工厂。每当调用这个工厂时,它就创建一个新的closure(即迭代器本身)。这closure 将它的状态保存在其外部变量t 和i 中。每当调用这个迭代器时,它就从列表t 中返回下一个值。直到最后一个元素返回后,迭代器就会返回nil,以此表示迭代的结束。 泛型for语法: for <var-list> in <exp-list> do <body> end 其中,<var-list>是一个或多个变量名的列表,以逗号分隔;<exp-list>是一个或多个表达式的列表,同样以逗号分隔。通常表达式只有一个元素,即一句对迭代器工厂的调用。 for 做的第一件事是对in 后面的表达式求值。 简单示例: function values(t) local i = 0 return function() i = i + 1 return t[i] end end t = {1, 2, 3} for element in values(t) do print(element)

lua学习之迭代器与泛型for第一篇

萝らか妹 提交于 2020-02-29 00:25:58
迭代器与泛型 for 1 迭代器与 closure 「迭代器」是一种可以遍历一种集合中的所有元素的机制 在 lua 中通常将迭代器表示为 函数 每调用一次函数,即返回集合中的「下一个」元素 每个迭代器都需要在每次成功调用之间保存一些 状态 这样就知道 它现在所在的位置 以及 如何步进到一下位置 一个 closure 就是一种可以访问 其外部嵌套环境中的局部变量 的函数 这些变量可用于在成功调用之间保持状态值 从而使 closure 可以记住它在一次遍历中所在的位置 创建一个 closure 必须创建它的「非局部变量」 一个 closure 结构通常包含两个函数 closure 本身 创建该 closure 的工厂函数 while values 就是工厂,每次调用这个工厂,就会创建一个新的 closure 即迭代器其本身 这个 closure 将它的想要保存在其外部变量 t 和 i 中 每当调用这个迭代器时,它就从列表 t 中返回下一个值 直到最后一个元素返回后,迭代器会返回 nil ,表示迭代的结束 function values(t) local i = 0 return function () i = i + 1 return t[i] end end t = {123, 333, 444} iter = values(t) -- 创建迭代器 while true do

C++字符串、向量和数组知识概要总结

China☆狼群 提交于 2020-02-28 22:26:07
字符串 记一下string的几种没用过的初始化操作,赋值不能这么搞 string s1("value"); string s2(s1); string s3(6,'z'); string s4=string(6,'a'); 上面没咋提拷贝初始化,带等号的都是拷贝初始化,这里都是直接初始化 getline(cin, line); 可接受句子,遇到换行符则停止, 并且换行符也会被读入,但是这个换行符又被丢弃了 while(getline(cin, line)){ cout << line << endl; } while(cin>>line){ cout << line << endl; } 从上述两个例子里可以看出getline确实读入了换行符而且确实又把它给丢弃了。 注意注意注意!! string.size()这个函数返回的值的类型并不是int,而是string::size_type类型的,并且非常值得注意的是这个类型他是无符号类型的,用这个直接带入一些式子中可能会有意想不到的结果的; 尤其要注意的是s.size()<n这样的结构。~!! 关于string大小的判断,比较第一对相异的字符大小即可,若没有相异的,谁长谁大,或者就是相等 可以用字符字面值和字符串字面值转换成string 当string对象和字符字面值以及字符串字面值混在一起使用是,必须确保加号两边至少一个是string

趣味理解迭代器和生成器

冷暖自知 提交于 2020-02-28 21:58:47
学习了这么久Python,那么如果让你说迭代器协议和生成器协议是什么,你是否可以很快速的回答上来。 咳咳咳,好吧,你脑海中有这个概念,但是没办法清楚的做出回答。那让我们重新认识一下他们吧! 迭代器: 1.一辆满载的大客车,这里面坐着一群回家的乘客,在行驶路线的沿途中,没到一个地方,总会有几个人下车,还剩下一小部分在到达终点站的时候就会全部下车。 2.一辆满载的旅游客车,里面坐着去旅行的人,在沿途中,他们并不会下车,等到了旅行地点的时候,乘客便会一个一个从车上全部都下来。 通过上面两个实例,我们便可以引出我们的协议。 1.在大客车的协议就是当你到达目的地的时候,就可以靠边停车,不要求在一个必须在一个地方全都下车。 2.在旅游客车中,旅游公司会和游客指定一个协议,就是不到达目的地,不能下车。 这就是他们两个的协议。 为什么要引出这两个协议呢? 因为我们要引出迭代器,在Python大家在进行循环的时候使用最多的应该就是For循环吧,通常我们会对一个列表、元组、字典、字符串、range函数、文件句柄等进行循环,但是我们却没有办法循环一个整型数字(123)。这是因为它不是一个可迭代的对象,**可迭代协议:在一个对象的方法中必须有 iter () 。**那么怎样知道一个对象中是否有这个方法呢?通过 dir([ ]) 我们可以了解到列表中所有的内置方法,当然我们也可以通过 from

函数式 Python 中的 Pipe 与 itertools

萝らか妹 提交于 2020-02-28 17:53:59
1、迭代器与管道函数式编程简介 可迭代器(iterable),不仅限于list/str等,还包括任何包含有yield关键字的函数,后者未必有规律的迭代特征。标准库中的itertools包提供了更加灵活的产生迭代器的工具,这些工具的输入大都是已有的迭代器函数的封装,并且itertools给出的函数都是针对广义迭代器而言。而len()等函数是针对狭义迭代器,即sequence(i.e. str, list, tuple)而言的。 以内置函数range()为例,执行结果会是一次性计算好整个序列。这对于很长的序列来说会比较耗时,甚至带来性能问题。因而,python还提供了内置函数,提供了惰性求值版本,那就是xrange()。它利用yield特性,第一次执行时仅仅返回迭代器,不到用时是不会求值的。 实际上,itertools提供的函数都是惰性的,并且给原内置函数都重写了惰性版本。如imap()对于内置的map()。 扩展库Pipe则对内置函数和部分itertools进行了封装,提供了类似unix bash下的管道式调用风格,更接近人类从左到右的阅读习惯,使得代码更加优雅。其他动态语言,如ruby, c#-lambda java8-lambda也都提供了类似的 链式调用 形式。 另外,也提供了@Pipe装饰器,可以非常方便地扩展出自己的管道函数,或者继续封装其他itertools中的有用函数。

迭代器模式

泪湿孤枕 提交于 2020-02-28 11:32:31
迭代器模式 我们在日常的开发中,特别是在使用集合的过程中都或多或少使用了迭代器来对集合进行遍历。这时候我们就会思考一个问题,明明简单的For循环就能解决的集合遍历问题,我们非得创造一个迭代器来进行集合的遍历,使用迭代器来遍历到底有什么不一样的地方吗?本着‘存在即合理’的原则,我们通过手写迭代器的方式来深入了解一下迭代器模式的实现和带来的编码好处。 实现案例 有一个书架,我们想要知道这个书架里面堆了哪些书籍,这时候我们就需要对书架里面的书一本一本的遍历,直到没有书本,我们就能清楚的知道数据上堆满了哪些书籍。 可以被遍历的标记(生成迭代器的接口) 首先提供一个接口,来标明这个类是可以被遍历的集合。实现这个接口的类可以生成对应的迭代器。 123 public interface { public abstract Iterator iterator();} 迭代器接口 迭代器的抽象接口,定义了两个方法 (1)是否还有下一个元素 (2)返回下一个元素 1234 public interface Iterator{ public abstract boolean hasNext(); public abstract Object next();} 集合存储的元素(书本) 123 public class book{ private String name;} 迭代器实现类

C++_十六章_智能指针_关于string对象、string指针和空指针的总结_关于智能指针相互赋值会导致出现空字符的问题_标准模板库

允我心安 提交于 2020-02-28 10:55:18
目录 1、智能指针 2、关于string对象、string指针和空指针的总结 3、关于智能指针相互赋值会导致出现空字符的问题 4、标准模板库 1、智能指针 01) 在使用new为指针分配内存空间的时候,有可能会出现忘记添加delete或者是没有忘记但不执行delelte的情况 ,此时就会导致内存泄露,例如如下情况: 1 void remodel(std::string & str) 2 { 3 std::string * ps = new std::string(str); 4 double * pd1 = new double[8]; //new返回一个可以存储8个double行数据的地址,pd1是一个指针 5 ... 6 if(weird_thing()) 7 throw exception(); //如果执行此句,那么就有可能不执行下面的delete 8 str = *ps; 9 delete ps; 10 return; 11 } delete有可能不会被执行的情况 02)使用智能指针 (1)这三个智能指针模板(auto_ptr、unique_ptr和shared_ptr)都定义了类似指针的对象,可以将new获得的地址赋给这些对象。当智能指针过期时,其析构函数将使用delete  来释放内存。下图说明了常规指针和auto_ptr之间的差别.(unique

C++迭代器删除、插入元素

强颜欢笑 提交于 2020-02-28 09:01:40
迭代器是容器五大组件中十分重要的一种,为我们提供了一种与容器种类、元素类型无关的访问容器的方法。 按照是否提供修改容器元素内容、遍历方法等、迭代器可分为五大类,如下图所示: 有关五种迭代器的具体使用,可参考CPPreference等权威资料。 首先贴一篇博客: http://m.blog.csdn.net/zhongjiekangping/article/details/5624922 这篇博客很好地解答了我的部分疑惑。 现在考虑一个最简单的需求,如何删除vector的指定元素?如何在vector每个元素后追加一个元素?(实际上,对vector插入元素有可能很影响效率,如果频繁插入元素,可以考虑list等) 删除元素 std::vector< int> Vec; std::vector< int>::iterator itVec; for( itVec = Vec.begin(); itVec != Vec.end(); ) { if( WillDelete( *itVec) ) { itVec = Vec.erase( itVec); } else itList++; } 对vector、queue等,每次erase操作,函数会删除指定迭代器位置的元素,然后将后面的元素前移一位,erase返回指向被删除元素下一元素的迭代器。(其实,我认为,返回的还是指定的迭代器