迭代器

C++ traits技术浅谈

这一生的挚爱 提交于 2019-12-17 20:17:11
前言   traits,又被叫做特性萃取技术,说得简单点就是提取“被传进的对象”对应的返回类型, 让同一个接口实现对应的功能 。因为STL的算法和容器是分离的,两者通过迭代器链接。算法的实现并不知道自己被传进来什么。萃取器相当于在接口和实现之间加一层 封装 ,来隐藏一些细节并协助调用合适的方法,这需要一些技巧(例如,偏特化)。最后附带一个小小的例子,应该能更好地理解 特性萃取。   下面大部分来源于《STL源码剖析》,看原书能了解更多细节。 Traits编程技法   让我们一点点抛出问题,然后一点点深入。   1. 首先,在算法中运用迭代器时,很可能会用到 其相应型别 (迭代器所指之物的型别)。假设算法中有必要声明一个变量,以“迭代器所指对象的型别”为型别,该 怎么办呢?   解决方法是:利用function template的参数推导机制。 1 template <class I, class T> 2 void func_impl(I iter, T t) { 3 T tmp; // 这里就是迭代器所指物的类型新建的对象 4 // ... 功能实现 5 } 6 7 template <class I> 8 inline 9 void func(I iter) { 10 func_impl(iter, *iter); // 传入iter和iter所指的值,class自动推导 11

设计模式之行为型模式

Deadly 提交于 2019-12-17 19:19:58
【推荐】2019 Java 开发者跳槽指南.pdf(吐血整理) >>> 我们在前面已讨论了12种设计模式。其中涉及的是:变与不变,对变化如何处理,以及调用关系,对不可调用,如何方便实现成为可以调用。剩下的11个模式,都是与行为传递有关的,即不是变与不变的问题,也不是调用关系问题。而是调用流程控制的问题。这是因为,我们使用了类,使用了SOLID原则,调用流程不再是if else 或 switch case。 处理好这样的流程控制,则更易于我们的代码的简化。 Chain of Responsibility(责任链) :为解除请求的发送者和接受者之间耦合,而使多个对象都有机会处理这个请求。将这些对象连成一条链,并沿着这条链传递该请求,直到有一个对象处理它。 这样的做法,使得每一个类中的流程控制得以统一。并且,可以将这样的流程控制封装到对应的类中,而不是由调用者来处理,因而调用者不再需要了解这个链中有多少个程员,该按怎样的顺序调用。从而丢开了调用者与被调用者之间的紧密耦合。 实现方式:被调用者作为具体代码,其类中增加$next属性,保存下一个有责任的类。被调的方法中,判断,有没有$next,如果有,则调用$next中的同名方法。 总结:一次性同时调用多个类中的同一个方法。(类方法递归) 选择模式:通过类的链,实现方法选择的组合。 Command(命令) :将一个请求封装为一个对象

迭代器(Iterator)的使用方法

↘锁芯ラ 提交于 2019-12-17 14:47:33
迭代器(Iterator)   迭代器是一种设计模式,它是一个对象,它可以遍历并选择序列中的对象,而开发人员不需要了解该序列的底层结构。迭代器通常被称为“轻量级”对象,因为创建它的代价小。   Java中的Iterator功能比较简单,并且只能单向移动:   (1) 使用方法iterator()要求容器返回一个Iterator。第一次调用Iterator的next()方法时,它返回序列的第一个元素。注意:iterator()方法是java.lang.Iterable接口,被Collection继承。   (2) 使用next()获得序列中的下一个元素。   (3) 使用hasNext()检查序列中是否还有元素。   (4) 使用remove()将迭代器新返回的元素删除。   Iterator是Java迭代器最简单的实现,为List设计的ListIterator具有更多的功能,它可以从两个方向遍历List,也可以从List中插入和删除元素。 迭代器应用: list l = new ArrayList(); l.add("aa"); l.add("bb"); l.add("cc"); for (Iterator iter = l.iterator(); iter.hasNext();) { String str = (String)iter.next(); System.out

C++ STL基本容器使用

怎甘沉沦 提交于 2019-12-17 12:31:29
---恢复内容开始--- C++ STL基本容器使用 1:关联容器和顺序容器    c++中有两种类型的容器:顺序容器和关联容器,顺序容器主要有:vector、list、deque等。其中vector表示一段连续的内存地址,基于数组的实现,list表示非连续的内存,基于链表实现。deque与vector类似,但是对于首元素提供删除和插入的双向支持。关联容器主要有map和set。map是key-value形式的,set是单值。map和set只能存放唯一的key值,multimap和multiset可以存放多个相同的key值。 容器类自动申请和释放内存,我们无需new和delete操作。 2:顺序容器的介绍 1):vector,需要包含头文件#include<vector> 主要的操作有 //1.定义和初始化 vector<int> vec1; //默认初始化,vec1为空 vector<int> vec2(vec1); //使用vec1初始化vec2 vector<int> vec3(vec1.begin(),vec1.end());//使用vec1初始化vec2 vector<int> vec4(10); //10个值为0的元素 vector<int> vec5(10,4); //10个值为4的元素 //2.常用操作方法 vec1.push_back(100); //尾部添加元素

迭代器vs可迭代对象,推导式vs生成器

守給你的承諾、 提交于 2019-12-17 06:10:45
迭代器vs可迭代对象,生成式vs生成器,推导式 迭代器vs可迭代对 推导式(生成式) vs 生成器 附录 迭代器vs可迭代对 迭代器(类):凡是实现了__iter__,__next__的对象就是迭代器。 可迭代对象:只实现了__iter__方法 例子:手写迭代器,实现Range()函数 class Range: def __init__(self, start, stop=None, step=1): if stop is None: # 说明没有传start的值. self.start = 0 self.stop = start else: self.start = start self.stop = stop self.step = step def __iter__(self): return self def __next__(self): # 返回当前值,并更新下一个值 if self.start < self.stop: temp = self.start self.start += self.step return temp else: raise StopIteration 注意: 1)iter方法,什么都不用做,返回它自己 2)next函数,返回当前值,并更新下一个。不满足条件时抛出StopIteration 例子2:使用迭代器实现斐波那契数列 """

Java 集合框架之Collection

喜欢而已 提交于 2019-12-17 04:23:53
     此图是 java 中 Collection 相关的接口与类的关系的类图。其中,类只是集合框架的一部分,比较常用的一部分。   第一次画类图,着实很费劲,不过收获也不小。   下面是相关接口和类的解释说明。文字来自 JDK API 1.6 中文版。原谅我的懒惰,实在不想自己写,太麻烦。如有错误,还请指正。   如图,Set、Queue、List 接口都继承自 Collection 接口。    AbstractCollection<E>   此类提供 Collection 接口的骨干实现,以最大限度地减少了实现此接口所需的工作。   要实现一个不可修改的 collection,编程人员只需扩展此类,并提供 iterator 和 size 方法的实现。(iterator 方法返回的迭代器必须实现 hasNext 和 next。)   要实现可修改的 collection,编程人员必须另外重写此类的 add 方法(否则,会抛出 UnsupportedOperationException),iterator 方法返回的迭代器还必须另外实现其 remove 方法。   按照 Collection 接口规范中的建议,编程人员通常应提供一个 void (无参数)和 Collection 构造方法。    Set   一个不包含重复元素的 collection。更确切地讲,set

Iterator<转>

怎甘沉沦 提交于 2019-12-17 03:47:56
Iterator就是迭代器的意思。 Iterator是一个接口,利用迭代器主要是获取元素,很少删除元素。有三个方法: 1)hasNext():判断是否有更多的元素,如果有返回true。 2)next():在hasNest()的判断下,如果有更多的元素,就返回下一个元素。 3)Remove() 删除所返回的上一个元素。(可选操作)至少要返回一次才能删除元素。也就是说如果上一个元素都没有,那么怎么能删除呢?那不是要出现异常了吗? 具体操作: 1)定义一个Iterator类型的变量it,在集合框架当中Collection提供了一个方法iterator(),可以返回一个迭代器。只要是间接继承或者直接继承Collection的都有这个方法。所以可以用ArrayList的一个对象al去返回一个迭代器。 使用Iterator获得元素: 代码 import java.util.Arrays; import java.util.Iterator; import java.util.List; public class ArrayListTest { public static void main(String[] args) { ArrayList al = new ArrayList(); al.add(new Point(1, 2)); al.add(new Point(5, 2));

C# 迭代器 详解

試著忘記壹切 提交于 2019-12-16 22:30:19
这里仅针对非泛型迭代器加以说明,泛型迭代器类似。 代码一: public class Cars { private int [] intArr = { 1 , 2 , 3 , 4 , 5 , 6 , 7 }; /// <summary> /// 命名迭代器 /// </summary> /// <param name="isReverse"> 是否倒序迭代 </param> /// <returns></returns> public IEnumerable SortEnum( bool isReverse) { if ( ! isReverse) { for ( int i = 0 ; i < intArr.Length; i ++ ) { yield return intArr[i]; } } else { for ( int i = intArr.Length - 1 ; i >= 0 ; i -- ) { yield return intArr[i]; } } } // fun } // clas 然后就可以对该类进行迭代操作了,代码如下: Cars c = new Cars(); foreach (var item in c.SortEnum(true)) { Console.WriteLine(item); } 其实编译时编译器为该类生成了一个内部类

STL标准库-容器-unordered_set

我与影子孤独终老i 提交于 2019-12-16 17:57:47
技术在于交流、沟通,本文为博主原创文章转载请注明出处并保持作品的完整性 unordered_set与与unordered_map相似,这次主要介绍unordered_set unordered_set它的实现基于hashtable,它的结构图仍然可以用下图表示,这时的空白格不在是单个value,而是set中的key与value的数据包 有unordered_set就一定有unordered_multiset.跟set和multiset一样,一个key可以重复一个不可以 unordered_set是一种无序集合,既然跟底层实现基于hashtable那么它一定拥有快速的查找和删除,添加的优点.基于hashtable当然就失去了基于rb_tree的自动排序功能 unordered_set无序,所以在迭代器的使用上,set的效率会高于unordered_set template<class _Value, class _Hash = hash<_Value>, class _Pred = std::equal_to<_Value>, class _Alloc = std::allocator<_Value> > class unordered_set : public __unordered_set<_Value, _Hash, _Pred, _Alloc> { typedef _

Java——Iterator迭代器

血红的双手。 提交于 2019-12-16 17:12:32
迭代器(Iterator)   迭代器是一种设计模式,它是一个对象,它可以遍历并选择序列中的对象,而开发人员不需要了解该序列的底层结构。迭代器通常被称为“轻量级”对象,因为创建它的代价小。   Java中的Iterator功能比较简单,并且只能单向移动:   (1) 使用方法iterator()要求容器返回一个Iterator。第一次调用Iterator的next()方法时,它返回序列的第一个元素。注意:iterator()方法是java.lang.Iterable接口,被Collection继承。   (2) 使用next()获得序列中的下一个元素。   (3) 使用hasNext()检查序列中是否还有元素。   (4) 使用remove()将迭代器新返回的元素删除。   Iterator是Java迭代器最简单的实现,为List设计的ListIterator具有更多的功能,它可以从两个方向遍历List,也可以从List中插入和删除元素。 迭代器应用: list l = new ArrayList(); l.add("aa"); l.add("bb"); l.add("cc"); for (Iterator iter = l.iterator(); iter.hasNext();) { String str = (String)iter.next(); System.out