迭代器

C++ Set & MultiSet

倾然丶 夕夏残阳落幕 提交于 2020-03-21 23:50:26
转自 http://www.cppblog.com/wanghaiguang/archive/2012/06/05/177627.html STL Set介绍 集合(Set)是一种包含已排序对象的关联容器。多元集合(MultiSets)和集合(Sets)相像,只不过支持重复对象,其用法与set基本相同。 Set 又称集合,实际上就是一组元素的集合,但其中所包含的元素的值是唯一的,且是按一定顺序排列的,集合中的每个元素被称作集合中的实例。因为其内部是通过链表的方式来组织,所以在插入的时候比vector 快,但在查找和末尾添加上比vector 慢。 multiset 是多重集合,其实现方式和set 是相似的,只是它不要求集合中的元素是唯一的,也就是说集合中的同一个元素可以出现多次。 构造: explicit set(const Compare&=compare()); 如:set<int,less<int> > set1; less<int>是一个标准类,用于形成升序排列函数对象。降序排列是用greater<int>。 Template<class InputIterator> set(InputIterator, InputIterator,\ const Compare&=compare()); 如:set<int ,less<int> >set2(vector1.begin()

java集合框架——List

∥☆過路亽.° 提交于 2020-03-21 06:19:23
一、List接口概述 List有个很大的特点就是可以操作角标。 下面开始介绍List接口中相对于Collection接口比较特别的方法。在Collection接口中已经介绍的方法此处就不再赘述。 1.添加 void add (int index, E element) 在列表的指定位置插入指定元素(可选操作)。 boolean addAll (int index, Collection <? extends E > c) 将指定 collection 中的所有元素都插入到列表中的指定位置(可选操作)。 这两个方法相对于Collection接口,可以直接在特定的地方插入新的元素或者集合。 2.删除。 E remove (int index) 移除列表中指定位置的元素(可选操作)。 这个方法相对于Collection接口来说,可以直接删除特定位置上的元素。 3.修改 E set (int index, E element) 用指定元素替换列表中指定位置的元素(可选操作)。 这个方法可以将指定位置上的元素替换为另外一个元素(对象)。 4.查找 E get (int index) 返回列表中指定位置的元素。 int indexOf ( Object o) 返回此列表中第一次出现的指定元素的索引;如果此列表不包含该元素,则返回 -1。 int lastIndexOf ( Object o)

day14_集合框架1(ArrayList,LinkedList,HashSet)

我的梦境 提交于 2020-03-21 04:15:34
1.集合框架大致示意图: 2.集合概述: /* 数据 -封装在-> 对象 -存储在-> 集合 集合类: 1.为什么出现集合类? 面向对象语言对事物的体现都是以对象的形式,所以为了方便对 多个对象的操作,就对 对象进行存储,集合就是存储对象最常用的 一种方式 2.数组和集合类同是容器,有何不同? 数组虽然也可以存储对象,但长度是固定的,只能存储同一类型对象 集合长度是可变的. 数组中可以存储基本数据类型,集合只能存储对象 集合类的特点: 集合只用于存储对象 集合长度是可变的 集合可以存储不同类型的对象 关于数组: 例如: Person p=new int[3]; p[0]=new Person("zhangsan"); ... 为什么有这么多容器?(集合) 因为每一个容器对数据的存储方式都有不同 这个存储方式称为数据结构. */ 3.Collection中的一些方法: /* 1.add方法的参数类型是Object,以便于接收任意类型的对象 2.集合中存储的都是对象的地址(引用) */ import java.util.*; class CollectionDemo { public static void sop(Object obj) { System.out.println(obj); } public static void base_method() { ArrayList

集合框架Collection

孤街醉人 提交于 2020-03-21 03:50:29
Collection定义了集合框架的共性功能。 1,添加 add(e); addAll(collection); 2,删除 remove(e); removeAll(collection); clear(); 3,判断。 contains(e); isEmpty(); 4,获取 iterator(); size(); 5,获取交集。 retainAll(); 6,集合变数组。 toArray(); 1,add方法的参数类型是Object。以便于接收任意类型对象。 2,集合中存储的都是对象的引用(地址) 什么是迭代器呢? 其实就是集合的取出元素的方式。 如同抓娃娃游戏机中的夹子。 迭代器是取出方式,会直接访问集合中的元素。 所以将迭代器通过内部类的形式来进行描述。 通过容器的iterator()方法获取该内部类的对象。 Collection |--List:元素是有序的,元素可以重复。因为该集合体系有索引。 |--ArrayList:底层的数据结构使用的是数组结构。特点:查询速度很快。但是增删稍慢。线程不同步。 |--LinkedList:底层使用的链表数据结构。特点:增删速度很快,查询稍慢。线程不同步。 |--Vector:底层是数组数据结构。线程同步。被ArrayList替代了。因为效率低。     枚举就是Vector特有的取出方式。   发现枚举和迭代器很像。  

C++之容器(关联容器)

ぃ、小莉子 提交于 2020-03-20 18:31:54
关联容器和顺序容器的本质区别:关联容器是通过键存取和读取元素、顺序容器通过元素在容器中的位置顺序存储和访问元素。因此,关联容器不提供front、push_front、pop_front、back、push_back以及pop_back,此外对于关联容器不能通过容器大小来定义,因为这样的话将无法知道键所对应的值什么。 两个基本的关联容器类型是map和set。map的元素以键-值对的形式组织:键用作元素在map的索引,而值则表示所存储和读取的数据。set仅包含一个键,并有效地支持关于某个键是否存在的查询。set和map类型的对象不允许为同一个键添加第二个元素。如果一个键必须对应多个实例,则需使用multimap或mutiset类型,这两种类型允许多个元素拥有相同的键。 在介绍关联容器之前,必须先介绍一种与它相关的简单的标准库类型--pair类型: pair类型的初始化-------在头文件utility中 pair<T1,T2> p1; 创建一个pair对象,两个元素的类型分别是T1,T2类型,采用初值进行初始化 pair<T1,T2> p1(v1,v2); 创建一个pair对象,两个元素的类型分别是T1,T2类型,采用v1,v2分别进行初始化 make_pair(v1,v2); 以v1、v2的只进创建一个pair对象,类型分别是v1、v2的类型 p.first

Python迭代器详解

落花浮王杯 提交于 2020-03-20 18:07:43
从for循环说起 我们都知道,在Python中,我们可以for循环去遍历一个列表,元组或者range对象。 for i in [1,2,3]: print(i) for i in range(0,10): print(i) 那底层的原理是什么样的呢?这其中涉及到了几个概念,“可迭代”,“迭代器”,“生成器”等,大部分人可能听过这些名词,但是他们具体的含义以及之间的关系可能没搞清楚,以下就是它们之间的关系图,接下来我们就来分析这个关系图。 可迭代对象与迭代器(先不关心左边的生成器) 如果一个对象是可迭代对象,那么我们就可以用for循环去遍历它,比如列表、元组、字符串等都是可迭代对象。而我们用for循环去遍历它的原理就是,先获取了它的迭代器,然后使用迭代器的next方法去逐一遍历。 a = [1,2,3] # for相当于下面的代码 for i in a: print(i) # for循环分解(实际是通过Python底层C语言实现的,此处只是演示) ## 第一步: 获取迭代器 iterator_a = iter(a) ## 第二步: 通过next逐个遍历 while True: try: print(next(iterator_a)) except StopIteration: ## 第三步:遇到StopIteration异常,停止 break 注意可迭代对象与迭代器的区别

迭代器类别

故事扮演 提交于 2020-03-18 22:08:41
迭代器类别 输入迭代器 输入迭代器:可以读取序列中的元素。一个输入迭代器必须支持 用于比较两个迭代器的相等和不相等运算符(==、!=) 用于推进迭代器的前置和后置递增运算(++) 用于读取元素的解引用运算符(*);解引用只会出现在赋值运算符的右侧 箭头运算符(->),等价于(*it).member,即,解引用迭代器,并提取对象的成员 输入迭代器只用于顺序访问。对于一个输入迭代器,*it++保证是有效的,但递增它可能导致所有其他指向流的迭代器失效。其结果就是,不能保证输入迭代器的状态可以保存下来并用来访问元素。因此,输入迭代器只能用于单遍扫描算法。算法find和accumulate要求输入迭代器;而istream_iterator是一种输入迭代器。 输出迭代器 输出迭代器:可以看做输入迭代器功能上的补集——只写而不读元素。输出迭代器必须支持 用于推进迭代器的前置和后置递增运算(++) 解引用运算符(*),只能出现在赋值运算符的左侧(向一个已经解引用的输出迭代器赋值,就是将值写入它所指向的元素) 我们只能向一个输出迭代器赋值一次。类似输入迭代器,输出迭代器只能用于单遍扫描算法。用作目的位置的迭代器通常都是输出迭代器。例如,copy函数的第三个参数就是输出迭代器。ostream_iterator类型也是输出迭代器。 前向迭代器 前向迭代器:可以读元素。这类迭代器只能在序列中沿一个方向移动

设计模式-迭代器模式

我们两清 提交于 2020-03-17 08:10:32
某厂面试归来,发现自己落伍了!>>> 1. 迭代器模式概述 迭代器模式, 我觉得这个图还是很贴切的. 迭代器相当于是电视机的遥控器, 聚合对象相当于是电视机. 电视机中有很多电视频道的集合, 那些电视频道到底是怎么组合在一起的, 我们并不知道, 也无需知道, 因为遥控器也就是迭代器给我们提供了遍历电视频道的方法, 我们只需要调用不同的迭代器方法即可遍历电视机中所有节目的集合. 在软件开发中, 我们经常需要使用聚合对象来存储一系列的数据. 聚合对象有两个职责: 存储数据; 遍历数据. 从依赖性来看, 前者是聚合对象的基本职责; 而后者既是可变的, 也是可分离的. 因此可将遍历数据的行为从聚合对象中分离出来, 封装在一个被称为"迭代器"的对象中, 由迭代器来提供遍历局和对象内部数据的行为, 这将简化聚合对象的设计, 更符合"单一职责原则"的要求. 迭代器模式: 提供一种方法来访问聚合对象, 而不用暴露这个对象的内部表示, 其别名为 游标. 迭代器模式是一种对象行为型模式. 在迭代器模式中包含聚合和迭代器两个层次结构, 考虑到系统的灵活性和可扩展性, 在迭代器模式中应用了工厂方法模式, 模式结构图如下: 迭代器模式中的几个角色: 抽象迭代器(Iterator): 它定义了访问和遍历元素的接口, 声明了用于遍历数据元素的方法. 具体迭代器(ConcreteIterator):

迭代器模式

末鹿安然 提交于 2020-03-17 08:09:10
某厂面试归来,发现自己落伍了!>>> 又称为游标模式, 它提供一种顺序集合、容器对象元素的方法, 而又无须暴露集合内部表示。 特征: 抽离集合对象迭代行为到迭代器中, 提供一致访问接口 属于行为型模式 适用场景: 1、访问一个集合对象的内容而无须暴露它的内部表示 2、为遍历不同的集合结构提供一个统一的访问接口 public interface Iterator< E > { /** * 获取下一个 * @return */ E next () ; /** * 是否存在下一个 * @return */ boolean hasNext () ; } public interface IAggregate< E > { /** * 添加 * @param element * @return */ boolean add ( E element) ; /** * 移除 * @param element * @return */ boolean remove ( E element) ; /** * 迭代器 * @return */ Iterator< E > iterator () ; } public class ConcreteIterator< E > implements Iterator< E > { private List< E > list ; private int

python-17

僤鯓⒐⒋嵵緔 提交于 2020-03-17 04:53:59
1 # 列表生成式 2 a = [x*2 for x in range(10)] # 这两个变量必须一致 3 print(a) 4 5 #列表 元组的高级赋值办法 6 b,c = ["123",6] 7 print(b) #123 8 print(c) #6 1 # python的垃圾回收机制 2 #给变量赋值的时候值的内存地址被变量引用 3 #如果值的内存地址没有被任何对象引用的话,python就将该内存进行回收释放 4 5 #生成器额2种创建方式 6 7 #生成器的创建方式一: 8 a = (x*2 for x in range(10)) 9 #print(a) <generator object <genexpr> at 0x0000000001DEA1B0> 目前没有任何值,只是个迭代器 10 11 #生成器的创建方式二: 12 #在函数内部使用yield关键字创建生成器 13 #函数本身不是生成器,但是函数的执行就是生成器 如 test() 就是个生成器 14 15 def test(): 16 print("ok") 17 yield 2 #yield后面的值相当于返回值 18 print("ok2") 19 yield 5 20 21 #生成器中值的遍历next()方法 22 #生成器可以当成迭代器去使用for方法迭代 for i in a: next(i) 23 a