迭代器

C++ 容器 与 迭代器 笔记

南笙酒味 提交于 2020-02-08 14:36:07
一,什么是容器? 数组,stack,queue,可以容纳一类资源称之为容器。 向量容器: 数组这种数据结构最大的先天不足就是他受限于一个固定的长度。 在程序中,数组的空间是固定的,不可以多,容易溢出或者出现溢出这种现象。 C++标准库提供的向量(vector)类型解决了先天不足的问题。 就像可以创建各种不同类型的数组一样,我们也可以创建各种不同类型的向量。 std::vector vectorName; 优点: 随着往容器添加元素而无限增大 用size()方法可查出当前长度 可以通过push_back()往其中添加东西 可以通过访问数组元素的语法来访问给定向量的各个元素 实例: # include <iostream> # include <string> # include <vector> int main ( ) { std : : vector < std : : string > names ; names . push_back ( "Q" ) ; names . push_back ( "W" ) ; names . push_back ( "E" ) ; names . push_back ( "R" ) ; for ( int i = 0 ; i < names . size ( ) ; i ++ ) { std : : cout << "name[" << i

珂朵莉树的易懂教学

删除回忆录丶 提交于 2020-02-07 23:34:34
0xff:前置芝士 在阅读本文前,请先了解并会熟练掌握:set、set的迭代器、结构体struct的相关操作, 不会的先去了解并使用熟练后再来看本文 一、什么是珂朵莉树? 珂朵莉树是一种数据结构,又称Old Driver Tree(ODT老司机树),是一种基于set的暴力数据结构,等一下会讲解。 二、为什么叫珂朵莉树? 这个数据结构诞生于一道cf毒瘤题 CF896C Willem, Chtholly and Seniorious ,命名为珂朵莉树的原因很明显,题目名字翻译过来是威廉,珂朵莉和瑟尼欧里斯,然后题目中附带了一张动漫中的截图(威廉帮珂朵莉调整瑟尼欧里斯),出题人ODT在题解里写到了这个新数据结构,命名为 Chtholly Tree ,据说能艹翻标程 珂朵莉·诺塔·瑟尼欧里斯出自TV动画 末日时在做什么?有没有空?可以来拯救吗? ,珂学家指的就是珂朵莉厨(没错我就是) 中国珂学院: https://www.chtholly.ac.cn/ 好回归正题: 三、为什么要用珂朵莉树? 珂朵莉树的关键操作在于它可以把一段区间赋值成同一个数x, 并且数据要随机,因为它本身就很玄学 四、怎么写珂朵莉树呢? 1.节点初始化 一棵树肯定有节点啊,这里用一个 struct 存 struct Node { int l,r; mutable int val; Node(int _l,int _r=

【STL 基本容器】

淺唱寂寞╮ 提交于 2020-02-06 23:01:49
1.顺序容器与关联容器 c++中有两种类型的容器:顺序容器和关联容器,顺序容器主要有:vector、list、deque等。其中vector表示一段连续的内存地址,基于数组的实现,list表示非连续的内存,基于链表实现。deque与vector类似,但是对于首元素提供删除和插入的双向支持。关联容器主要有map和set。map是key-value形式的,set是单值。map和set只能存放唯一的key值,multimap和multiset可以存放多个相同的key值。 2.顺序容器 (1) vector 内部数据结构:数组。 随机访问每个元素,所需要的时间为常量。 在末尾增加或删除元素所需时间与元素数目无关,在中间或开头增加或删除元素所需时间随元素数目呈线性变化。 可动态增加或减少元素,内存管理自动完成,但程序员可以使用reserve()成员函数来管理内存。 vector的迭代器在内存重新分配时将失效(它所指向的元素在该操作的前后不再相同)。当把超过capacity()-size()个元素插入vector中时,内存会重新分配,所有的迭代器都将失效;否则,指向当前元素以后的任何元素的迭代器都将失效。当删除元素时,指向被删除元素以后的任何元素的迭代器都将失效。 (2)deque 内部数据结构:数组。 随机访问每个元素,所需要的时间为常量。 在开头和末尾增加元素所需时间与元素数目无关

STL 常用遍历算法 for_each()

邮差的信 提交于 2020-02-06 11:42:21
STL 常用遍历算法 头文件 #include < algorithm> 用for_each(iterator beg,iterator end,_func)函数 beg 开始迭代器 end 结束迭代器 _func 函数或者函数对象 具体方法1:(函数) # include <iostream> # include <algorithm> # include <vector> using namespace std ; //普通函数 void print ( int val ) { cout << val << " " ; } //常用遍历算法 int main ( ) { vector < int > v ; for ( int i = 0 ; i < 10 ; i ++ ) v . push_back ( i ) ; for_each ( v . begin ( ) , v . end ( ) , print ) ; //这里只需要添加函数名即可 return 0 ; } 2:(函数对象) # include <iostream> # include <algorithm> # include <vector> using namespace std ; //函数对象 class print { public : void operator ( ) ( int val ) {

Leetcode-字母组合迭代器(python)

一笑奈何 提交于 2020-02-06 08:15:22
题目 字母组合迭代器: 请你设计一个迭代器类,包括以下内容: 一个构造函数,输入参数包括:一个 有序且字符唯一 的字符串 characters(该字符串只包含小写英文字母)和一个数字 combinationLength 。 函数 next() ,按 字典序 返回长度为 combinationLength 的下一个字母组合。 函数 hasNext() ,只有存在长度为 combinationLength 的下一个字母组合时,才返回 True;否则,返回 False。 示例: CombinationIterator iterator = new CombinationIterator(“abc”, 2); // 创建迭代器 iterator iterator.next(); // 返回 “ab” iterator.hasNext(); // 返回 true iterator.next(); // 返回 “ac” iterator.hasNext(); // 返回 true iterator.next(); // 返回 “bc” iterator.hasNext(); // 返回 false 提示: 1 <= combinationLength <= characters.length <= 15 每组测试数据最多包含 10^4 次函数调用。 题目保证每次调用函数 next

C++中STL常用容器的优点和缺点

北战南征 提交于 2020-02-06 05:59:06
【转】 C++中STL常用容器的优点和缺点 我们常用到的 STL 容器 有vector、list、deque、map、multimap、set和multiset,它们究竟有何区别,各自的优缺点是什么,为了更好的扬长避短,提高程序性能,在使用之前需要我们了解清楚。 verctor vector类似于C语言中的数组,它维护一段连续的内存空间,具有固定的起始地址,因而能非常方便地进行随机存取,即 [] 操作符,但因为它的内存区域是连续的,所以在它中间插入或删除某个元素,需要复制并移动现有的元素。此外,当被插入的内存空间不够时,需要重新申请一块足够大的内存并进行内存拷贝。值得注意的是,vector每次扩容为原来的两倍,对小对象来说执行效率高,但如果遇到大对象,执行效率就低了。 #include<iostream> #include<cstdio> #include<vector> using namespace std; vector<int> a;//大概能开3e7个vector vector<int> b; int main(){ int x=10; a.push_back(x);//插到末尾 a.push_back(x=20); a.insert(a.end(),x=40); //相当于push_back a.insert(a.begin()+1,30); //插到任何一个位置 a

23种设计模式

孤街浪徒 提交于 2020-02-06 03:04:44
1.单例模式(Singleton Pattern) 定义: Ensure a class has only one instance, and provide a global point of access to it.(确保某一个类只有一个实例,而且自行实例化并向整个系统提供这个实例。) 通用代码:(是线程安全的) public class Singleton { private static final Singleton singleton = new Singleton(); //限制产生多个对象 private Singleton(){ } //通过该方法获得实例对象 public static Singleton getSingleton(){ return singleton; } //类中其他方法,尽量是static public static void doSomething(){ } } 使用场景: ● 要求生成唯一序列号的环境; ● 在整个项目中需要一个共享访问点或共享数据,例如一个Web页面上的计数器,可以不用把每次刷新都记录到数据库中,使用单例模式保持计数器的值,并确保是线程安全的; ● 创建一个对象需要消耗的资源过多,如要访问IO和数据库等资源; ● 需要定义大量的静态常量和静态方法(如工具类)的环境,可以采用单例模式(当然

《c++ primer 》chapter10

落爺英雄遲暮 提交于 2020-02-06 02:52:00
1、使用流迭代器读取文本文件,存入一个vector中的string里,并用流迭代器和copy输出 # include <iostream> # include <fstream> # include <iterator> # include <vector> # include <string> using namespace std ; int main ( void ) { ifstream FILE ( "1.txt" ) ; //输入流FILE绑定文件1.txt istream_iterator < string > string_it ( FILE ) ; //从FILE输入流中读取string类型 istream_iterator < string > string_eof ; //默认构造定义尾后迭代器 //获取输入流FILE中的string类型元素加入vector中 vector < string > string_vt ; while ( string_it != string_eof ) string_vt . push_back ( * string_it ++ ) ; //使用迭代器输出vector中的内容 ostream_iterator < string > os_it ( cout , " " ) ; copy ( string_vt . begin

Java集合框架——迭代器

给你一囗甜甜゛ 提交于 2020-02-06 02:46:26
迭代器 一、查看迭代器源码 按住Ctrl键将鼠标放在ArrayList上,并点击Open Implementation(实现) 在右侧outline列表里找到 iterator() 方法 按住Ctrl键将鼠标放在Itr上,并点击Open Declaration(声明) 可以发现Itr是ArrayList的一个内部类 二、迭代器的源码分析 通过观察源码,发现迭代器对象是当前集合的内部类创建的对象,并且这个内部类实现了Iterator接口 把迭代器定义成内部类的原因:每一个种类的集合的数据结构是不一样的,遍历的过程也是不一样的,所以要根据当前集合的情况定义一个迭代器类,而不能为所有集合定义一个统一的迭代器类 三、案例实操:遍历学生对象集合 用集合存储5个学生对象,并遍历该集合 分析: ①定义学生类 ②创建集合 ③创建学生对象,并添加到集合 ④遍历:toArray,iterator //Student.java package com . collection . demo2 ; public class Student { private String name ; private int age ; public Student ( String name , int i ) { super ( ) ; this . name = name ; this . age = i ; }

tensorflow实战之数据加载进阶

老子叫甜甜 提交于 2020-02-06 00:55:29
我们知道Dataset对象能够方便的进行数据加载,而Dataset数据集一般使用流程如下: (1)创建Dataset对象; (2)对Dataset对象进行变换操作; (3)创建Dataset迭代器; (4)在会话Session中取数据。 对于(1)(2)我们已经有详细的了解,在实际使用过程中如何创建迭代器?如何进行多epoch的训练?当遍历完数据集时如何继续输入数据进行训练?另外,对于不同的数据类型如何加载,如Imagenet数据、yolo等目标检测数据,本篇将继续深入的介绍。 目录 一、Dataset对象迭代器的创建方法 总结 二、数据加载方法汇总 1、ImageNet数据 2、VOC2014数据 3、文本数据 一、Dataset对象迭代器的创建方法 make_one_shot_iterator 该迭代器只会将对应的数据遍历一次,不会多次遍历。因此,该迭代器内部自动实现了迭代器的初始化,而其他类型的迭代器需要额外的初始化。这种迭代器适用于之遍历一次整个数据集的情况,多次遍历需要其他类型的迭代器。 import tensorflow as tf import numpy as np dataset = tf.data.Dataset.from_tensor_slices(np.array([1.0, 2.0, 3.0, 4.0, 5.0])) iterator = dataset