迭代计算

SGI-STL简记(八)-哈希关联容器(hash、hash_set、hash_map、hash_multiset、hash_multimap)

て烟熏妆下的殇ゞ 提交于 2019-12-01 02:04:48
stl_hash_fun.h : hash:模板函数对象类类型,一般作为hash_set、hash_map、hash_multiset、hash_multimap容器的默认哈希函数,目前提供了多个特化版本,并重载实现operator(),参数类型有char、unsigned char、char*、int等 内置可转化为整型的数据类型的版本;除const char*和char*使用了__stl_hash_string计算哈希值,其余的则直接返回参数value值作为哈希值;哈希值返回值类型为size_t; __stl_hash_string:遍历各个字符串元素,累积遍历计算哈希值,计算方式为h=0;h=5*h+*s,*s为遍历字符串相应元素,h即为最后的哈希值,类型为unsigned long; 对于其他的hash模板实例实现,如basic_string<_CharT,_Traits,_Alloc>、crope、wrope或者是用户自定义的hash模板函数对象实现; stl_hashtable.h : _Hashtable_node:哈希表节点模板类; 数据成员: _M_next:指向下一个哈希表节点的指针; _M_val:保存当前哈希表节点的值(哈希值); _Hashtable_iterator/_Hashtable_const_iterator:哈希表迭代器模板类,模板参数_Val

SGI-STL简记(六)-序列容器(bit_vector)

人盡茶涼 提交于 2019-12-01 02:03:58
stl_bvector.h : bit_vector 重声明为vector<bool, alloc>即使用alloc作为内存分配器,其为非模板类,__BVECTOR也即vector<bool, _Alloc>为模板类,若使bit_vector重声明为__BVECTOR则也可为模板类; 相比vector,其可保持一个位一个元素而不是至少一个字节一个元素;此外基本的函数和vector相同,还有其他额外的提供的接口实现; bit_vector一般被认为是非模板类; _Bit_reference:位引用类,作为位迭代器类和bit_vector类中的引用类型; 数据成员,均为unsigned int类型或指针类型(后面为了便于分析,暂且定为4字节大小): _M_p:指向缓冲区中存储该位码值所在的地址; _M_mask:当前位掩码值(事实上目前一般情况下该值始终为仅含一个1其余均为0的二进制形式下的值),也即_M_p所指向的4字节位码中相应掩码值中为1的位置即为当前引用类表示的位值; 成员函数: 构造函数初始化位码值地址和掩码值; operator bool:重载bool转换,内部实现为将位码值和掩码值按照位取与的结果; operator=:重载赋值拷贝运算符,内部实现为为拷贝参数值为true,则调整位码值为当前位码值与掩码值按位或的结果,否则为当前位码值与掩码值取反后再与其求与的结果;

SGI-STL简记(六)-序列容器(deque)

元气小坏坏 提交于 2019-12-01 02:03:58
stl_deque.h : deque:一种具有双端插入和删除,可随机访问元素的容器,从首部或后插入或删除在常量时间内完成,从中间则需线性时间内完成; __deque_buf_size:获取队列节点缓冲区大小(工具函数),当数据元素类型字节size小于512时则为512/size,否则为1,(意味着节点容器上限为512字节或者是一个自定义类型元素大小的字节); _Deque_iterator:专用于deque容器的迭代器模板类;重声明常规类型以及迭代器类型和常量迭代器类型,迭代器分类为random_access_iterator_tag;此外声明了一个_Map_pointer指向数据元素的指针的指针; 数据成员: _M_cur:指向当前node节点容器元素的当前指针; _M_first:指向当前的node节点容器第一个元素的指针; _M_last:指向当前的node节点容器最后一个元素尾部的指针; _M_node:指向node节点容器指针的指针(其值为对应的map缓冲区的槽, 而槽的值即为对应node节点缓冲区首地址); 成员函数: _S_buffer_size:静态函数,获取当前元素类型下的节点容器缓冲区大小(内部调用__deque_buf_size),如int时,则获得大小为512/4(即128个元素); 无参构造函数初始化所有成员为空,带参构造函数T*x, _Map

SGI-STL简记(六)-序列容器(list)

女生的网名这么多〃 提交于 2019-12-01 02:03:50
stl_list.h : list:一个可从任意位置快速插入和删除元素的双向链表,可在常数时间内完成,但是取数据、查找等则需要线性时间; _List_node_base:链表节点基类struct,仅包含_M_next、_M_prev成员,其分别为指向当前节点基类类型的下一个、上一个节点的指针; _List_node:节点模板类,继承于_List_node_base,只是增加了一个数据成员_M_data,用以保存实际的node节点数据; _List_iterator_base:链表迭代器基类,所属迭代器类型为bidirectional_iterator_tag; 内部成员_M_node为当前迭代器指向的节点; _List_node_base构造函数参数类型_List_node_base,该值以初始化_M_node; _M_incr:调整当前迭代器所指的节点为该节点的下一个节点; _M_decr:调整当前迭代器所指的节点为该节点的上一个节点; 此外重载的operator==,operator!=比较操作符,其实际上是直接比较迭代器的_M_node成员(地址); _List_iterator:链表迭代器模板类,继承于_List_iterator_base; 该模板类重声明了多个常规类型;多个重载版本的构造函数以初始化迭代器; 此外重载了解引用、取指针操作符(返回为当前迭代器_M_node

SGI-STL简记(四)-迭代器解析

大兔子大兔子 提交于 2019-12-01 02:02:52
stl_iterator_base.h : 迭代器类型萃取、特性; 几个特别的迭代器标签tag:input_iterator_tag、output_iterator_tag、forward_iterator_tag、bidirectional_iterator_tag、random_access_iterator_tag; 其中除了output_iterator_tag独立以外,其他标签tag依次为继承关系(如forward_iterator_tag继承于input_iterator_tag、....),也就意味着前者迭代器类型也可 使用后者;迭代器标签tag类型于__true_type、__false_type; 早期用于HP的input_iterator、output_iterator、forward_iterator、bidirectional_iterator、random_access_iterator分别重声明了iterator_category、value_type、 difference_type、pointer、reference类型,各迭代器的iterator_category(迭代器类别)类型使用了各自的迭代器标签tag, 此外output_iterator比较特别,其他值均为void; iterator:迭代器模板类,只是对迭代器类型重声明

初识Java8新特性Lambda(二) 之collections

给你一囗甜甜゛ 提交于 2019-11-30 21:58:19
背景(Background) 如果从一开始就将lambda表达式(闭包)作为Java语言的一部分,那么我们的Collections API肯定会与今天的外观有所不同。随着Java语言获得作为JSR 335一部分的lambda表达式,这具有使我们的Collections接口看起来更加过时的副作用。尽管可能很想从头开始并构建替换的Collection框架(“ Collections II”),但是替换Collection框架将是一项主要任务,因为Collections接口遍布JDK库。相反,我们将继续增加扩展方法,现有的接口(如进化策略Collection,List或Iterable),或者以新的接口(如“流”)被改装到现有的类,使许多希望的成语,而没有让人们买卖其值得信赖的ArrayListS和HashMap秒。(这并不是说Java永远不会有一个新的Collections框架;很明显,现有的Collections框架存在局限性,而不仅仅是为lambda设计的。除此以外,创建一个经过改进的Collections框架是一个很好的考虑因素。 JDK的未来版本。) 并行性是这项工作的重要推动力。因此,要鼓励那些成语是非常重要的两个 sequential-和并行友好。我们主要通过较少地关注就地突变而更多地关注产生新值的计算来实现这一目标

整理

牧云@^-^@ 提交于 2019-11-30 19:52:48
C++11 知识整理 对class的理解 答:首先,class 也是一种数据类型,只不过是可以由开发者自由定义的一种数据类型;可以用来封装成员变量和成员函数;支持抽象,继承,多态性;在定义数据类型的时候,private,public,也从一定程度上保证了数据的安全性 抽象性:含有纯虚函数的类被称为抽象类,用途是为派生类提供基类 多态性:对于不同对象接受相同信息时产生不同的动作。分为静态多态和动态多态,体现在两个方面,一是在编译的时候,函数重载是一个方面;二是在运行的时候,虚函数是一个方面 继承性:子类具有父类的各种属性和方法,而不必再次编写相同的代码 什么是类 答:一种将抽象转换成用于定义的类型的工具,将数据表示方法和操纵这些数据的方法组合一起整合成一个包 如何将私有成员变量取出 答:方法1:通过public中的函数,传出参数将私有成员变量取出。方法2:友元函数 *this 指针 答:经典回答,进入一个房间,能看见房间里的东西,但是整个房间看不到了,然后this指针就是时刻盯着这整个房间。this指针是类的一个自动生成,自动隐藏的私有成员。存在于类的非静态成员函数中,指向内调用函数所在的对象。全局仅有一个this指针,当一个对象被创建的时候,this指针就存放指向对象数据的首地址 类和对象的区别和联系 答:区别:(1).定义不同 ,类是现实世界或思维世界的实体在计算机的反映

Python迭代器

懵懂的女人 提交于 2019-11-30 18:41:06
可迭代对象 我们知道可以对list、tuple、str等类型的数据使用for...in...的循环语法从其中依次拿到数据进行使用,我们把这样的过程称为遍历,也叫迭代 。迭代是访问集合元素的一种常用方式。 通过isinstance()判断一个对象是否可以迭代 [Python] 纯文本查看 复制代码 ? 01 02 03 04 05 06 07 08 09 10 11 12 13 14 15 16 In [ 50 ]: from collections import Iterable In [ 51 ]: isinstance ([], Iterable) Out[ 51 ]: True In [ 52 ]: isinstance ({}, Iterable) Out[ 52 ]: True In [ 53 ]: isinstance ( 'abc' , Iterable) Out[ 53 ]: True In [ 54 ]: isinstance (mylist, Iterable) Out[ 54 ]: False In [ 55 ]: isinstance ( 100 , Iterable) Out[ 55 ]: False 我们分析对可迭代对象进行迭代使用的过程,发现每迭代一次(即在for...in...中每循环一次)都会返回对象中的下一条数据

生成器generator和迭代器Iterator

╄→尐↘猪︶ㄣ 提交于 2019-11-30 15:00:32
一、列表生成式 在学习生成器迭代器之前先了解一下什么是列表生成式,列表生成式是Python内置的非常简单却强大的可以用来创建list的生成式。什么意思?举个例子,如果想生成列表[0,1,2,3,4,5]可以使用list(range(6)),但是如果想要生成[,,,,,]即[0,1,4,9,16,25]怎么做? #方法一:循环 >>> L = [] >>> for x in range(6): ... L.append(x**2) ... >>> L [0, 1, 4, 9, 16, 25] #方法二:列表生成式 >>> [x**2 for x in range(6)] [0, 1, 4, 9, 16, 25] 观察方法一、方法二可以发现,使用方法二列表生成式更为简洁、明了,方法二就是列表生成式。再来几个例子加深理解: #计算正整数0-5之间偶数平方 >>> [x**2 for x in range(6) if x%2==0] [0, 4, 16] #列表生成式使用两个变量 >>> d = {'a':'1','b':'2','c':'3'} >>> [k+'='+v for k,v in d.items()] ['a=1', 'b=2', 'c=3'] 二、生成器 通过列表生成式,可以直接创建一个列表。但是,受到内存限制,列表容量肯定是有限的。而且,创建一个包含100万个元素的列表

四.迭代器和生成器

喜欢而已 提交于 2019-11-30 13:51:51
楔子 假如我现在有一个列表l=['a','b','c','d','e'],我想取列表中的内容,有几种方式? 首先,我可以通过索引取值l[0],其次我们是不是还可以用for循环来取值呀? 你有没有仔细思考过,用索引取值和for循环取值是有着微妙区别的。 如果用索引取值,你可以取到任意位置的值,前提是你要知道这个值在什么位置。 如果用for循环来取值,我们把每一个值都取到,不需要关心每一个值的位置,因为只能顺序的取值,并不能跳过任何一个直接去取其他位置的值。 但你有没有想过,我们为什么可以使用for循环来取值? for循环内部是怎么工作的呢? 迭代器 返回顶部 python中的for循环 要了解for循环是怎么回事儿,咱们还是要从代码的角度出发。 首先,我们对一个列表进行for循环。 for i in [1,2,3,4]: print(i) 上面这段代码肯定是没有问题的,但是我们换一种情况,来循环一个数字1234试试 for i in 1234 print(i) 结果: Traceback (most recent call last): File "test.py", line 4, in <module> for i in 1234: TypeError: 'int' object is not iterable 看,报错了!报了什么错呢?“TypeError: 'int'