迭代器

迭代器 Iteraotr

江枫思渺然 提交于 2020-01-31 00:31:59
概述 所有集合类均未提供相应的遍历方法,而是把把遍历交给迭代器完成。迭代器为集 合而生,专门实现集合遍历 Iterator是迭代器设计模式的具体实现 Iterator方法 boolean hasNext(): 判断是否存在另一个可访问的元素 Object next(): 返回要访问的下一个元素 void remove(): 删除上次访问返回的对象。 遍历的本质 实现 Iterable 接口 For-each 循环 优点 增强的for循环,遍历array 或 Collection的时候相当简便 无需获得集合和数组长度,无需使用索引访问元素,无需循环条件 遍历集合时底层调用Iterator完成操作 数组: 不能方便的访问下标值 不要在for-each中尝试对变量赋值,只是一个临时变量 集合: 与使用Iterator相比,不能方便的删除集合中的内容 缺点 遍历集合用法 遍历 List List list = new ArrayList<>(); list.add("de"); list.add("dddd"); list.add("dfjiow"); list.add("pp"); Iterator<String> iterator = list.iterator(); while(iterator.hasNext()) {//判断是否有下一个 String o =iterator

python 迭代器函数概述

南楼画角 提交于 2020-01-30 15:55:39
'''认识函数:在一个完整的项目中,某些功能会反复的使用。那么会将功能封装成函数,当我们要使用功能的时候直接调用函数即可本质:函数就是对功能的封装优点1、简化代码结构,增加了代码的复用度(重复使用的程度)2、如果想修改某些功能或者调试某个BUG,还需要修改对应的函数即可''''''定义函数:格式:def 函数名(参数列表): 语句 return 表达式def:函数代码块以def关键字开始函数名:遵循标识符规则():是参数列表的开始和结束参数列表(参数1,参数2,……,参数n):任何传入函数的参数和变量必须放在圆括号之间,用逗号分隔。函数从函数的调用者哪里获取的信息冒号:函数内容(封装的功能)以冒号开始,并且缩进语句:函数封装的功能return:一般用于结束函数,并返回信息给函数的调用者表达式:即为要返回给函数的调用者的信息,注意:最后的return 表达式,可以不写,相当于return None''''''凯 = "帅"print(凯)''''''函数的调用格式:函数名(参数列表)函数名:是要使用的功能的函数函数名字参数列表:函数的调用者给函数传递的信息,如果没有参数,小括号也不能省略函数调用的本质:实参给形参赋值的过程''' 来源: https://www.cnblogs.com/pygo/p/12242877.html

C++ 常用集合算法

放肆的年华 提交于 2020-01-30 13:36:27
#define _CRT_SECURE_NO_WARNINGS #include<iostream> #include <algorithm> #include <vector> #include <iterator> using namespace std; /* set_intersection算法 求两个set集合的交集 注意:两个集合必须是有序序列 @param beg1 容器1开始迭代器 @param end1 容器1结束迭代器 @param beg2 容器2开始迭代器 @param end2 容器2结束迭代器 @param dest 目标容器开始迭代器 @return 目标容器的最后一个元素的迭代器地址 */ void test01() { vector<int>v1; vector<int>v2; for (int i = 0; i < 10;i++) { v1.push_back(i); v2.push_back(i + 5); } vector<int> vTarget; vTarget.resize( min(v1.size(),v2.size())); vector<int>::iterator itEnd= set_intersection(v1.begin(), v1.end(), v2.begin(), v2.end(), vTarget.begin()

STL源码剖析之vector

送分小仙女□ 提交于 2020-01-30 12:03:52
容器vector的底层实现是由数组(连续的线性空间)实现的,veector是动态分配内存空间的,也就是说,随着元素的加入,它的内部机制会自行扩充空间以便于容纳新元素。因此vector的底层实现技术的核心是对大小的控制以及重新分配内存空间时对数据的移动效率。因为vector的底层实现是由数组来实现的,所以vector的迭代器就是原生指针。vector的简单实现如下: 我把迭代器的内嵌的相应的型别封装的起来。 template<typename T> struct IteratorType { typedef T Value_type; //迭代器所指之物的型别 typedef T* Pointer; typedef T* Iterator; //vector的迭代器 typedef T& Reference; typedef size_t Size_type; //vector容器的大小 typedef size_t Difference_type; //迭代器之间的距离 }; #include"IteratorType.h" #pragma once template<typename T> class Vector { public: Vector() :start(nullptr), finish(nullptr), end_finish(nullptr) {}; Vector

C++ 常用查找算法

牧云@^-^@ 提交于 2020-01-30 04:52:34
#define _CRT_SECURE_NO_WARNINGS #include<iostream> #include <algorithm> using namespace std; #include <vector> #include <string> #include <functional> /* find算法 查找元素 @param beg 容器开始迭代器 @param end 容器结束迭代器 @param value 查找的元素 @return 返回查找元素的位置 */ void test01() { vector<int>v; for (int i = 0; i < 10;i++) { v.push_back(i); } vector<int>::iterator pos = find(v.begin(), v.end(), 5); if (pos!=v.end()) { cout << "找到了数据:" << *pos << endl; } else { cout << "未找到" << endl; } } class Person { public: Person(string name, int age) { this->m_Name = name; this->m_Age = age; } bool operator==( const Person&p) {

【STL深入理解】vector

蓝咒 提交于 2020-01-30 02:28:33
这篇文章不打算讲述vector的基本用法,而是总结一下近期我大量阅读C++经典书籍时遇到的一些关于vector的容易忽略的知识点,特意将它们记录下来,以便以后查阅。 1.v[0]和v.at(0)的区别 void f(vector<int>& v) { v[0]; //A v.at(0); //B } 观察该函数,我们使用A和B的形式来访问v的元素,他们有什么区别?他们唯一区别就是如果v空则B会抛出std::out_of_range的异常,至于A行为标准未加任何说明。所以B方式可以防止越界操作,但是B方式较A方式效率要低(因为加入了越界检查)。 2.resize()和reserve()是不同的操作 int main() { vector<int> v; v.reserve(2); cout << "capacity: " << v.capacity() << endl; assert(v.capacity() == 2); v[0] = 1; //A v[1] = 2; //B return 0; } 上面的代码是有问题的,我在VS2015下进行编译运行时弹出“vector越界访问”的错误。那该段程序错在哪里? 首先这里的断言可能会失败。因为reserve操作将保证vector容量>=2。而且这里的断言也是多余的。 然后A和B的复制是有问题的,因为该程序忽视了resize

[C++ STL] map使用详解

自闭症网瘾萝莉.ら 提交于 2020-01-29 22:36:13
一、概述 map 由红黑树实现,其元素都是 “键值/实值” 所形成的一个对组(key/value pairs)。每个元素有一个键,是排序准则的基础。每一个键只能出现一次,不允许重复。 map主要用于资料一对一映射的情况,map 内部自建一颗红黑树,这颗树具有对数据自动排序的功能,所以在 map 内部所有的数据都是有序的。比如一个班级中,每个学生的学号跟他的姓名就存在着一对一映射的关系。 二、定义及初始化 使用之前必须加相应容器的头文件: #include <map> // map属于std命名域的,因此需要通过命名限定,例如using std::map; 定义的代码如下: map<int, string> a; // 定义一个int类型的映射a // map<int, string> a(10); // error,未定义这种构造函数 // map<int, string> a(10, 1); // error,未定义这种构造函数 map<int, string> b(a); // 定义并用映射a初始化映射b // map<int, string> b(a.begin(), a.end()); // error,未定义这种构造函数 三、基本操作 3.1 容量函数 容器大小: mp.size(); 容器最大容量: mp.max_size(); 容器判空: mp.empty();

JavaScript-迭代器模式

自闭症网瘾萝莉.ら 提交于 2020-01-29 14:05:11
迭代器模式 顺序访问一个集合 使用者无需知道集合内部结构(封装) jQuery 示例 <!DOCTYPE html> <html> <head> <meta charset="UTF-8" /> <title>Document</title> </head> <body> <p>jquery each</p> <p>jquery each</p> <p>jquery each</p> <script src="https://cdn.bootcss.com/jquery/3.3.1/jquery.js"></script> <script> var arr = [1, 2, 3]; var nodeList = document.getElementsByTagName("p"); var $p = $("p"); // 要对这三个变量进行遍历,需要写三个遍历方法 // 第一 arr.forEach(function(item) { console.log(item); }); // 第二 var i, length = nodeList.length; for (i = 0; i < length; i++) { console.log(nodeList[i]); } // 第三 $p.each(function(key, p) { console.log(key, p); })

dict.c设计思想

試著忘記壹切 提交于 2020-01-29 08:24:52
双hash_table设计 typedef struct dict { dictType * type ; void * privdata ; dictht ht [ 2 ] ; long rehashidx ; int iterators ; } dict ; 作者在dict数据类型中引入了两个hash_table,其作用是为了动态变化hash_table的大小。 按照常规操作,如果我们想要将一个hash_table的大小进行动态变化,我们需要进行两个步骤 1:改变数组大小 2:将old_hash_table内全部元素进行rehash,重新链接至new_hash_table上。 如果我们在瞬时间内完成从old_hash_table到new_hash_table的转化的话,意味着我们必须对old_hash_table的元素全部遍历一遍,这种操作显然是很费时间的,容易导致CPU在一段时间内处于一个很繁忙的状态(这里没有引入线程什么的,所以这个操作在dict内存储很多数据时,很可能致使Redis无法及时相应其他请求,而致使服务质量下降)。 因此这里引入了一个 rehash 状态,表示当前字典正在进行 rehash ,即将old_hash_table数据迁移至new_hash_table的状态。通过阅读源代码,我们会发现这样一个函数 static void _dictRehashStep

乱入:生成器+习题复习

被刻印的时光 ゝ 提交于 2020-01-28 23:56:27
##:生成器 (虽然说生成器和迭代器可以说是Python近几年来引入的最强大的两个概念,但是生成器的学习并不涉及到高级的魔法方法,甚至巧妙的避开了类和对象,仅需要通过普通的函数就可以实现了,由于生成器的概念比较高级,所以在之前的函数章节并没有讲到它,学习就是需要一个渐进的过程。像上一节课的迭代器,很多人学了之后就感觉很简单,但是如果我们把迭代器放到循环那一章节来讲,大家势必就会一头雾水了。) (生成器事实上是迭代器的一种实现,那既然迭代器可以实现,那为什么还要生成器呢?有一句老话说得好:“存在即合理”。生成器的发明一方面就是使得Python更为简洁,因为迭代器需要我们去定义一个类和实现相关的方法,才可以定义一个灵活的迭代器。而生成器需要在普通的函数加上一个 yield 语句。另外一个重要的方面就是生成器的发明使得Python模仿协同程序的概念得以实现。) (所谓的协同程序就是 可以运行的独立函数 的调用,函数可以暂停或者挂起,并且在需要的时候从函数上一次离开的地方继续或者重新开始。那我们知道,对于一个普通的函数来说,我们调用它一般都是从函数的第一句开始走,结束用 return 语句或者 异常 或者 函数所有的语句执行完毕。一旦函数将控制权交还给调用者,那就意味着全部都结束了,因为我们说过:函数的所有的工作、保存都是局部变量,局部变量在调用结束都会自动消失。) (而 生成器 就是一个