字典

Redis 2.8.9源码

旧巷老猫 提交于 2020-12-06 18:25:24
Redis使用字典的方式实现了数据库键空间,今天就记录一下字典的实现方式。 Redis 对字典的描述和实现源码在 src/dict.h src/dict.c,关于学习Redis字典如何进行测试或debug,请参考另外一篇文章: Redis 2.8.9源码 - 字典哈希表操作函数头整理,并注释作用和参数说明(附测试方法和代码以及使用方法) 字典结构: typedef struct dict { dictType *type; //根据存储内容的不同,自定义一组回调函数来控制比较申请内存释放空间等操作 void *privdata; //用于回调函数使用 dictht ht[2]; //存放hash表的结构 0 默认使用0,rehash的时候使用1 int rehashidx; //默认为-1,rehash开始的时候该变量设置为0,完成后重新设置为-1 int iterators; //正在进行的安全迭代的数量,释放安全迭代后会减1 } dict; typedef struct dictType { unsigned int (*hashFunction)(const void *key); //针对不同类型进行hash计算的函数,返回hash值 void *(*keyDup)(void *privdata, const void *key); //复制key void *(

走进Python世界(五)数据类型 5. 序列类型-字典(Dictionary)

被刻印的时光 ゝ 提交于 2020-03-01 23:11:37
什么是字典 字典是python中唯一的映射类型(哈希表) 字典是无序的 字典对象是可变的,但是字典的键必须使用不可变的对象,并且一个字典中可以使用不同的类型键值 keys() 或者values()返回键列表或者值列表 items()返回键值对的元组 创建字典 一般方法 常用的方式就是直接使用{} 一般语法如下: dict = {'Alice': '2341', 'Beth': '9102', 'Cecil': '3258'} 工厂方法 使用工厂方法dict来创建字典 一般语法如下: fdict=dict(['x',1],['y',2]) 内建方法 使用内建方法fromkeys来创建字典吗,字典元素中的元素巨有相同的值,默认为none 一般语法如下: ddict={}.fromkeys(('x','y'),-1) 访问字典 使用key来访问 使用key来访问字典的内容 一般语法如下: dict = {'Alice': '2341', 'Beth': '9102', 'Cecil': '3258'} dict[Alice] 循环遍历 如: dict = {'Alice': '2341', 'Beth': '9102', 'Cecil': '3258'} for key in dict.keys() print dict[k] 使用迭代器 dict = {'Alice': '2341',

VBS 脚本中的字典、动态数组、队列和堆栈

∥☆過路亽.° 提交于 2019-12-06 21:45:45
今天用VBS脚本写了几个程序,用到了字典(Dictionary)、动态数组(ArrayList)、队列(Queue)和堆栈(Stack)。现在写篇Blog总结一下 :-) 1.编写环境 今天突发奇想下载了个gVim来写VBS脚本,我用的版本是7.4的 在写脚本前,需要在gVim的安装根目录下,找到文件“_vimrc”,在里面添加下面三行: set number set softtabstop=4 set tabstop=4 意思分别是“显示行号”、“按退格键一次删掉4个空格”和“设定Tab长度为4个字符” 这个设置类似于Linux系统下文件“.vimrc”的配置 2.字典:Scripting.Dictionary VBS中的字典需要使用Scripting.Dictionary 脚本文件:a.vbs,包含字典的添加、删除、判断键是否存在、修改键、修改值、遍历、统计键值对个数 Option Explicit '建立字典 Dim Dict : Set Dict = CreateObject("Scripting.Dictionary") '添加键值对 Dict.Add "Key1", "Item1" Dict.Add "Key2", "Item2" Dict.Add "Key3", "Item3" '字典中键值对数量 WScript.Echo "字典中现有键值对数量: " & Dict

zg手册 之 python2.7.7源码分析(3)-- list 对象和 dict 对象

被刻印的时光 ゝ 提交于 2019-11-30 05:24:39
list 对象 list 对象的定义 list对象内部是使用数组实现,在数组中存储的是指针,指向要保存的对象。 allocated是list中数组的大小,ob_size是当前已经使用的数组大小。 typedef struct { // 可变长对象中有 ob_size,保存当前已经使用的数组大小 PyObject_VAR_HEAD PyObject **ob_item; // 数组的指针 Py_ssize_t allocated; // 分配的数组长度 } PyListObject; list 对象的缓存 list对象有缓存机制,对象在释放时会保存到空闲缓存池,待下一次申请的时候使用。 缓存池可以缓存80个list对象,缓存池满的时候list对象直接释放。 从list对象的创建和销毁过程了解它的缓存机制(为了关注重点,代码被简化过)。 // 缓存池的大小定义 #define PyList_MAXFREELIST 80 // 创建新的list对象 PyObject* PyList_New(Py_ssize_t size) { PyListObject *op; size_t nbytes = size * sizeof(PyObject *); // 如果缓存有空闲,直接从缓存中分配list对象的内存 if (numfree) { numfree--; op = free_list