迭代器

C++关联容器知识总结

折月煮酒 提交于 2020-03-17 00:29:02
  C++的容器类型可以分为顺序容器和关联容器两大类。顺序容器的知识可以参看我上篇的随笔 《C++顺序容器知识总结》 。关联容器支持通过键值来高效的查找和读取元素,这是它和顺序容器最大的区别。两种基本的关联容器类型是map和set。map的元素以键-值对的形式组织:键用作元素在map中的索引,而值则表示所存储和读取的数据。set仅包含一个键,并有效的支持关于某个键是否存在的查询。下表是关联容器的类型: map 关联数组;元素通过键来存储和读取 set 大小可变的集合,支持通过键实现快速读取 multimap 支持同一个键多次出现的map类型 multiset 支持同一个键多次出现的set类型 一.pair类型   在开始介绍关联容器之前,我们需要了解一种与之相关的标准库类型——pair类型,该类型定义在头文件utilty中。下表是pair类型提供的操作。 pair<T1,T2> p1; 创建一个空的pair对象,它的两个元素分别是T1和T2类型,采用值初始化 pair<T1,T2> p1(v1,v2); 创建一个pair对象,它的两个元素分别是T1和T2类型,其中first成员初始化为v2,second成员初始化为v2。 make_pair(v1,v2) 以v1,v2值创建一个新的pair对象,其元素类型分别是v1,v2类型 p1<p2 两个pair对象之间的小于运算,遵循字典顺序

leveldb文章列表

ⅰ亾dé卋堺 提交于 2020-03-16 18:25:42
leveldb文章列表 可写文件 Leveldb源码分析之可写文件(一)—WritableFile Leveldb源码分析之可写文件(二)—PosixWritableFile Leveldb源码分析之可写文件(三)—DataFile Leveldb源码分析之可写文件(四)—ManifestFile Leveldb源码分析之可写文件(五)—StdoutPrinter Leveldb源码分析之可写文件(六)—StringDest Leveldb源码分析之可写文件(七)—StringSink Leveldb源码分析之可写文件(八)—WritableFileImpl 序列化文件 Leveldb源码分析之序列化文件(一)—SequentialFile Leveldb源码分析之序列化文件(二)—PosixSequentialFile Leveldb源码分析之序列化文件(三)—SequentialFileImpl 文件操作 Leveldb源码分析之文件操作(一)—RandomAccessFile Leveldb源码分析之文件操作(二)—PosixMmapReadableFile Leveldb源码分析之文件操作(三)—PosixRandomAccessFile Leveldb源码分析之文件操作(四)—StringSource 比较器 leveldb源码分析之比较器(一)—

标准C++中的string类的用法总结

岁酱吖の 提交于 2020-03-15 22:02:48
标准C++中的string类的用法总结 相信使用过MFC编程的朋友对CString这个类的印象应该非常深刻吧?的确,MFC中的CString类使用起来真的非常的方便好用。但是如果离开了MFC框架,还有没有这样使用起来非常方便的类呢?是肯定的。也许有人会说,即使不用MFC框架,也可以想办法使用MFC中的API,具体的操作方法在本文最后给出操作方法。其实,可能很多人很可能会忽略掉标准C++中string类的使用。标准C++中提供的string类得功能也是非常强大的,一般都能满足我们开发项目时使用。现将具体用法的一部分罗列如下,只起一个抛砖引玉的作用吧,好了,废话少说,直接进入正题吧! 要想使用标准C++中string类,必须要包含 #include <string>// 注意是<string>,不是<string.h>,带.h的是C语言中的头文件 using std::string; using std::wstring; 或 using namespace std; 下面你就可以使用string/wstring了,它们两分别对应着char和wchar_t。 string和wstring的用法是一样的,以下只用string作介绍: string类的构造函数: string(const char *s); //用c字符串s初始化 string(int n,char c); /

标准C++中的string类的用法总结

心不动则不痛 提交于 2020-03-15 22:02:30
相信使用过MFC编程的朋友对CString这个类的印象应该非常深刻吧?的确,MFC中的CString类使用起来真的非常的方便好用。但是如果 离开了MFC框架,还有没有这样使用起来非常方便的类呢?是肯定的。也许有人会说,即使不用MFC框架,也可以想办法使用MFC中的API,具体的操 作方法在本文最后给出操作方法。其实,可能很多人很可能会忽略掉标准C++中string类的使用。标准C++中提供的string类得功能也是非常强大 的,一般都能满足我们开发项目时使用。现将具体用法的一部分罗列如下,只起一个抛砖引玉的作用吧,好了,废话少说,直接进入正题吧! 要想使用标准C++中string类,必须要包含 #include // 注意是,不是,带.h的是C语言中的头文件 using std::string; using std::wstring; 或 using namespace std; 下面你就可以使用string/wstring了,它们两分别对应着char和wchar_t。 string和wstring的用法是一样的,以下只用string作介绍: string类的构造函数: string(const char *s); //用c字符串s初始化 string(int n,char c); //用n个字符c初始化 此外,string类还支持默认构造函数和复制构造函数,如string s1

java设计模式--迭代器模式

廉价感情. 提交于 2020-03-15 19:53:02
迭代器模式:提供一种方法顺序来访问一个聚合对象中的元素,并且不暴露该对象的内部表示。当我们需要去遍历一个对象时就可以考虑使用迭代器模式。 聚集抽象类 public interface Collection { Iterator createIterator(); } 具体聚集类。 public class ConcreteCollection implements Collection { private List<Object> list = new ArrayList<>(); @Override public Iterator createIterator() { return new ConcreteIterator(this); } //获取集合大小 public int count(){ return list.size(); } //添加元素 public void setList(Object object){ list.add(object); } //获取元素 public Object getList(int index){ return list.get(index); } } 迭代抽象类。 public interface Iterator { //第一个节点 Object first(); //下一个节点 Object next(); //是否遍历完成

Python生成器和迭代器

眉间皱痕 提交于 2020-03-13 11:21:51
生成器 延迟操作,在需要的时候,调用它,才产生一个元素,节约空间资源,不立即产生全部结果 比如 yield 看一个 斐波那契数列 的例子 #斐波那契 def fib(length): a,b=0,1 n = 0 while n<length: yield b #到此停止 相当于return 但是下次调用next时会从上次yield的位置继续执行 n +=1 a,b = b,a+b return "没有更多内容" #会通过报错来返回 g = fib(10) try: print(next(g),next(g),next(g),next(g),next(g)) print(next(g),next(g),next(g),next(g),next(g)) print(next(g),next(g),next(g),next(g),next(g)) except Exception as e: print(str(e)) 生成器是一种特殊的迭代器,是可以迭代的 for i in fib(8): print(i) yield 也有返回值,可以调用 send 方法传入返回值 def f(): i=0 while i<10: t = yield i #t就是send回来的值 i会yield出去 i+=1 print(t) g = f() #第一次调用必须先传None print(g.send

STL源码剖析——容器

南笙酒味 提交于 2020-03-12 07:31:32
文章目录 一.模板特化 二.设计容器必须定义的型别 三.deque 四.心心念念的优先队列 五.hashtable的构造 一.模板特化 针对任何模板参数更进一步的条件限制所设计出来的一个特化版本,如: template < typename T > class C { . . . } ; //泛化版本,可以接受T为任何型别 template < typename T > class C < T * > { . . . } ; //特化版本,仅适合于T为原生指针时的情况 二.设计容器必须定义的型别 value_type difference_type reference_type pointer_type iterator_category: 其中设计实现了只读/只写迭代器,允许写入型,可双向移动,随机访问迭代器这5类 总结 traits编程技法(特性萃取)大量的实现大大提高了STL设计的便利性。需要注意设计正确的型别是迭代器的职责,而设计正确的迭代器则属于容器的职责。 三.deque deque与vector的差别 deque除了可以像vector那样在尾部以O(1)的时间复杂度完成插入和删除之外,还可以实现在头部以O(1)的代价插入元素 deque没有所谓的容量的概念,这个和它底层的空间组织形式有关,所以不提供reserve成员函数来限定容量

15.迭代器模式

依然范特西╮ 提交于 2020-03-12 04:17:03
迭代器模式 一、迭代器模式 1.基本介绍 1)如果我们集合元素是用不同的方式实现的,有数组,还有java的集合类等,当客户端要遍历这些集合元素时就要使用多种遍历方式,还会暴露元素的内部结构,可以考虑使用迭代器模式解决。 2)提供一种遍历集合元素的统一接口,用一致的方法遍历集合元素,不需要知道集合对象的底层表示。 2.原理类图 1)Iterator:迭代器接口,是系统提供,含义hasNext,next,remove 2)Concretelterator:具体的迭代器类,管理迭代 3)Aggregate:一个统一的聚合接口,将客户端和具体聚合解耦 4)ConcreteAggreage:具体的聚合持有对象集合,并提供一个方法,返回一个迭代器,该迭代器可以正确遍历集合 5)Client:客户端,通过Iterator和Aggregate 依赖子类 二、迭代器模式应用实例 ​ 编写程序展示一个学校院系结构:要在一个页面中展示出学校的院系组成,一个学校有多个学院一个学院有多个系。 1.代码实现 public class Client { public static void main(String[] args) { //创建学院 List<College> collegeList = new ArrayList<College>(); ComputerCollege

php迭代器模式(iterator pattern)

萝らか妹 提交于 2020-03-11 09:37:33
。。。 <?php /* The iterator pattern is used to traverse a container and access its elements. In other words, one class becomes able to traverse the elements of another class. The PHP has a native support for the iterator as part of built in \Iterator and \IteratorAggregate interfaces. */ class ProductIterator implements \Iterator { private $position = 0; private $productsCollection; public function __construct(ProductCollection $productsCollection) { $this->productsCollection = $productsCollection; } public function current() { return $this->productsCollection-> getProduct($this->position); }

JAVA中ListIterator和Iterator详解与辨析

孤街浪徒 提交于 2020-03-11 04:26:45
在使用 Java 集 合的时候,都需要使用Iterator。但是java集合中还有一个迭代器ListIterator,在使用List、ArrayList、 LinkedList和Vector的时候可以使用。这里有一点需要明确的时候,迭代器指向的位置是元素之 前的位置,如下图所示:   这里假设集合List由四个元素List1、List2、List3和List4组成,当使用语句Iterator it = List.Iterator()时,迭代器it指向的位置是上图中Iterator1指向的位置,当执行语句it.next()之后,迭代器指向的位置后 移到上图Iterator2所指向的位置。 首先看一下Iterator和ListIterator迭代器的方法有哪些。 Iterator迭代器包含的方法有: hasNext():如果迭代器指向位置后面还有元素,则返回 true ,否则返回false next():返回集合中Iterator指向位置后面的元素 remove():删除集合中Iterator指向位置后面的元素 ListIterator迭代器包含的方法有: add(E e): 将指定的元素插入列表,插入位置为迭代器当前位置 之前 hasNext():以正向遍历列表时,如果列表迭代器后面还有元素,则返回 true ,否则返回false hasPrevious():如果以逆向遍历列表