迭代器

C++primer(第五版)第九章 顺序容器(容器的运用及其部分习题解答,C++11特性总结,重点章节内容较多)

故事扮演 提交于 2020-01-12 04:21:45
顺序容器: 为程序员提供了控制元素存储和访问顺序的能力。(无序容器) 1.顺序容器的概述 A.顺序容器的类型 vector:可变大小数组。支持快速随机访问。在尾部之外的位置插入或删除元素可能很慢。 deque:双端队列。支持快速随机访问。在头尾位置插入/删除速度很快。 list:双向链表。只支持双向顺序访问。在list中任何位置进行插入/删除操作速度都很快。 forword_list:单向链表。只支持单向顺序访问。在链表的任何位置进行插入/删除操作速度都很快。(无size()) array:固定大小数组。支持快速随机访问。不能添加和删除元素。 string:与vector相似的容器,但专门用于保存字符。随机访问快。在尾部插入/删除速度快。 根据以上顺序容器的类型介绍,从而习题9.1答案就很简单了:list(字母序是任何位置插入)、deque(头部尾部插入/删除)、vector(可变容器)。 2.容器库 A.迭代器 迭代器中beigin是指容器首元素,end是指容器的最后一个元素的后一个位置; B.容器的拷贝 容器的拷贝有两种操作方法:一是直接拷贝整个容器,二是拷贝一个迭代器对指定的元素范围。前者需要两个容器的类型和元素类型必须匹配;后者不要求容器类型相同元素类型也可不同,但需要元素转换。 例子: list<string> authors ={"Milton",

【翻译】std::remove - C++ Reference

 ̄綄美尐妖づ 提交于 2020-01-12 00:12:43
   函数模板   std:: remove                     头文件<algorithm> template <class ForwardIterator, class T> ForwardIterator remove (ForwardIterator first, ForwardIterator last, const T& val);   从一个范围中删除某值   [注释:本文是 std::remove 算法的参考手册,关于 <cstdio.h> 头文件下的 remove 函数,请参见: http://www.cplusplus.com/reference/cstdio/remove/ ]   对范围 [first , last ) 进行转换(transform),移除其中所有与 val 相等的元素,返回一个指向新范围的 end 的迭代器。   (译注:transform 是 STL 的一个算法,不知道 std::remove 的底层是否经由 std::transform 实现。)   函数不改变所包含的“范围对象”的属性(换句话说,函数不改变数组或者容器的真实 size ):元素被移动是通过下一个不等于 val 的元素,来替换当前等于 val 的元素,而且会通过返回一个指向新 end 的迭代器,来指示出新的稍“短”一些的范围

Java实现双向链表

北城以北 提交于 2020-01-11 20:11:34
Java实现双向链表 1 双向链表需求 2 功能及算法分析 2.1 迭代功能实现分析 2.2 添加元素 2.3 删除节点 3 详细设计说明 3.1 LinkIterator内部类 3.2 DoubleLink部分方法的实现 3.3 代码实现 4 链表的测试用例 5 总结 1 双向链表需求 双向链表主要在节点的构成上与单向链表略有区别,双向链表的节点拥有一个元素存储空间和两个指针域,一个指针指向下一个节点,可记为next,一个指针指向上一个节点,可记为prev。如果节点是链表的头节点,则该节点的prev为null,如果节点是尾节点,该节点的next为null。当链表中只有一个节点的时候,头节点和尾节点指向链表中的唯一节点,如下图所示。 从应用角度上来说,双向链表比单向链表的使用场景更多,操作起来也更为方便,我们常用双向链表来实现队列和栈的操作。这也是本文中,我们需要为双向链表添加的额外功能。 2 功能及算法分析 双向链表,我们依然以实现Collection为基础,这一部分我们不再进行说明,我们主要对双向链表添加的特殊方法进行说明分析。 1.public E pushFrist(E e) :向链表的头结点添加新节点。 2.public E pushLast(E e) :向链表的结尾处添加新节点。 3.public E popFrist() :从链表的头结点取出元素,并从链表中删除该元素

迭代器方法

感情迁移 提交于 2020-01-11 12:44:31
不生成新数组的迭代器方法 这些方法不产生任何新数组,相反,他们要么对于数组中的每个元素执行某种操作,要么返回一个值。 forEach()方法 该方法接受一个函数作为参数,对数组中的每个元素使用该函数。 function square ( num ) { console . log ( num , num * num ) ; } var nums = [ 1 , 2 , 3 , 4 , 5 , 6 , 7 ] ; nums . forEach ( square ) ; 该程序的输出为: 1 1 2 4 3 9 4 16 5 25 6 36 7 49 every()方法 该方法接受一个返回值为布尔类型的函数,对数组中的每个元素使用该函数。如果对于所有的元素,该函数均返回true,则该方法返回true。 function isEven ( num ) { return num % 2 == 0 ; } var nums = [ 2 , 4 , 6 , 8 , 10 ] ; var even = nums . every ( isEven ) ; if ( even ) { console . log ( "all numbers are even" ) ; } else { console . log ( "not all numbers are even" ) ; } 输出为: all

C++之set和multiset容器初学

萝らか妹 提交于 2020-01-11 10:44:44
Set和multiset容器 set/multiset的简介 set是一个集合容器,其中所包含的元素是唯一的,集合中的元素按一定的顺序排列。元素插入过程是按排序规则插入,所以不能指定插入位置。 set采用红黑树变体的数据结构实现,红黑树属于平衡二叉树。在插入操作和删除操作上比vector快。 set不可以直接存取元素。(不可以使用at.(pos)与[]操作符)。 multiset与set的区别:set支持唯一键值,每个元素值只能出现一次;而multiset中同一值可以出现多次。 不可以直接修改set或multiset容器中的元素值,因为该类容器是自动排序的。如果希望修改一个元素值,必须先删除原有的元素,再插入新的元素。 头文件: #include <set> 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 set<string>

STL 常用方法

我是研究僧i 提交于 2020-01-11 08:43:27
1. 选择 C++ 刷算法的理由 1、C++ 速度快(C 不是更快吗,Java 太慢了) 2、C++ 有 STL(什么是 STL)——性能强大,使用方便的标准库 3、如何使用 STL 进行高效刷算法 4、好处:刷算法,学习成本低 5、如何从 C 到 C++(仅基础语法到刷算法程度) 俗话说:磨刀不误砍柴工,不会 C++ 仍然可以刷算法,但是效率相对很低。在 ACM 或各类程序算法竞赛中相比于 Java 代码的冗长,C 的繁琐,Python 的性能低下,C++ 以兼顾简洁和高效脱颖而出。 2.输入输出 C++ 保留了 C 的 scanf 和 printf,额外增加了 cin 和 cout。 Example: 2.1 C 程序中的输入输出 int a; scanf("%d", &a); printf("%d", a); 2.2 C++ 程序中的输入输出 int a; cin >> a; cout << a; 2.3 C++ 程序中的连续输入输出 int a, b, c; cin >> a >> b >> c; cout << a << b << c; 2.4 C++ 优雅地换行 cout << 1; cout << endl; cout << 2; cout << 3 << endl << endl; Notice: cin、cout 使用虽然很方便,但是比 scanf、printf

C++知识点(十)泛型程序设计与C++STL标准模板库

十年热恋 提交于 2020-01-11 08:34:15
1.泛型程序设计 把代码从特定的数据结构中分离出来,使得它不依赖于特定的数据结构而更加通用 容器->迭代器->算法 适配器 2.概念:用于界定具备一定功能的数据类型 comparable:可比较 Assignable:可赋值 Sortable:可比较且可赋值 3.模型:符合一个概念的数据类型就是该概念的模型 e.g. int 为comparable概念的模型 4.用概念做模板参数名 5.STL:standard template library 容器、迭代器、函数对象、算法 容器<->迭代器(作为算法的参数)->算法 ->函数对象(作为算法的参数) 容器:头文件<vector>     顺序     有序关联     无序关联 容器适配器:栈stack 队列queue 优先队列priority_queue 迭代器:泛型指针,包含头文件<iterator> ++,*,->,-- 函数对象:泛化的函数 ,头文件<functional> 算法:头文件<algorithm> transform 6.迭代器:泛型指针 输入流迭代器 istream_iterator <T> (cin) *(p++) 输出流迭代器 ostream_iterator <T> (cout,“输出间隔”) *(p++)=x 前向迭代器:输入&输出迭代器,且可单向遍历 双向迭代器:输入&输出迭代器,且可双向遍历

设计模式(十六)迭代器模式 Iterator

风流意气都作罢 提交于 2020-01-11 01:46:03
什么时候需要用到迭代器模式?   有许多中方法,可以把对象堆起来放进一个集合(可以是数组、堆栈、列表、哈希表,等等)。   每一种类型的集合,都有各自适用的时机。但是某个时间段,客户端可能希望去遍历这个集合。   怎么做?   让客户去得到这个集合的具体实现?显然这不是很现实。   而且针对不同的集合,我们需要用不同的方式去遍历它,这需要去深入了解各种数据结构,对客户端很不友好。   这时候,我们希望创建一种超集合(super collection),是客户端能够使用统一的方法去遍历集合,同时不需要关心具体的数据结构。   这就是迭代器模式。 迭代器模式:   迭代器模式提供一种方法,顺序访问一个聚合对象中的各个元素,而又不暴露其内部的表示。   从 Java 的角度来说,迭代器模式就是 Iterator 接口。 模拟场景:   有一个水果商店(FruitShop),内部采取数组的方式存储数据。   有一个肉食商店(MeatShop),内部采用链表的方式存储数据。   客户端希望去遍历这些数据, 没有迭代器的实现: public final class FruitShop { private String[] products = new String[MAX_PRODUCT]; private int index = 0; private static final int MAX

11.Python迭代器

北城余情 提交于 2020-01-10 23:02:28
⼀. 函数名的运⽤ 函数名是⼀个变量, 但它是⼀个特殊的变量, 与括号配合可以执⾏函数的变量. 1. 函数名的内存地址 2. 函数名可以赋值给其他变量 3. 函数名可以当做容器类的元素 4. 函数名可以当做函数的参数 5. 函数名可以作为函数的返回值 ⼆. 闭包 什么是闭包? 闭包就是内层函数, 对外层函数(非全局)的变量的引⽤. 叫闭包 我们可以使⽤__closure__来检测函数是否是闭包. 使⽤函数名.__closure__返回cell就是 闭包. 返回None就不是闭包 问题, 如何在函数外边调⽤内部函数呢? 那如果多层嵌套呢? 很简单, 只需要⼀层⼀层的往外层返回就⾏了 由它我们可以引出闭包的好处. 由于我们在外界可以访问内部函数. 那这个时候内部函 数访问的时间和时机就不⼀定了, 因为在外部, 我可以选择在任意的时间去访问内部函数. 这 个时候. 想⼀想. 我们之前说过, 如果⼀个函数执⾏完毕. 则这个函数中的变量以及局部命名 空间中的内容都将会被销毁. 在闭包中. 如果变量被销毁了. 那内部函数将不能正常执⾏. 所 以. python规定. 如果你在内部函数中访问了外层函数中的变量. 那么这个变量将不会消亡. 将会常驻在内存中. 也就是说. 使⽤闭包, 可以保证外层函数中的变量在内存中常驻. 这样做 有什么好处呢? 非常⼤的好处. 我们来看⼀个关于爬⾍的代码: 综上,

java集合总结

元气小坏坏 提交于 2020-01-10 22:45:24
一、集合的由来   通常,我们的程序需要根据程序运行时才知道创建多少个对象。但若非程序运行,程序开发阶段,我们根本不知道到底需要多少个数量的对象,甚至不知道它的准确类型。为了满足这些常规的编程需要,我们要求能在任何时候,任何地点创建任意数量的对象,而这些对象用什么来容纳呢?我们首先想到了数组,但是数组只能放统一类型的数据,而且其长度是固定的,那怎么办呢?集合便应运而生了! 为了对集合有个更加深入的了解,可以看我的这一篇文章: 用 Java 数组来实现 ArrayList 集合 http://www.cnblogs.com/ysocean/p/6812674.html 二、集合是什么?   Java集合类存放于 java.util 包中,是一个用来存放对象的容器。 注意:①、集合只能存放对象。比如你存一个 int 型数据 1放入集合中,其实它是自动转换成 Integer 类后存入的,Java中每一种基本类型都有对应的引用类型。    ②、集合存放的是多个对象的引用,对象本身还是放在堆内存中。    ③、集合可以存放不同类型,不限数量的数据类型。 发现一个特点,上述所有的集合类,除了 map 系列的集合,即左边集合都实现了 Iterator 接口,这是一个用于遍历集合中元素的接口,主要hashNext(),next(),remove()三种方法。它的一个子接口 ListIterator