stl

STL关联式容器

纵然是瞬间 提交于 2020-02-29 10:02:33
STL 序列式容器 : vector list deque forward_list stack STL 关联式容器 :里面存储数据的格式是<key,value>结构,与序列式容器相比 ,关联式容器的数据检索效率更高。 树形结构关联式容器 map multimap set multiset 底层均用红黑树实现。 键值对: 表示一组具有一一对应的关系的结构,其里面存储的是一种key_value 结构的键值对,value表示key对应的值。 map(有序) 1 map ,健值key 通常用于排序和唯一的标识元素,value和 key的类型可以不同,在 map内部,key和value通过成员类型value_type 绑定在一起,取别名为pair 2 map中的元素总是按照key值进行比较排序的 3 map中通过键值访问单个元素的速度往往比unordered_map 容器慢,但map进行迭代访问,可以得到一个有序的序列。 4 map支持下表访问 【】 因为map健值唯一 5 map通常底层用平衡二叉搜索树来实现(红黑树) map的类模版参数说明 class template std::map tempate<class key,//键类型 class T, 映射值类型 class Compare = less默认键值小的方式排序, , class Alloc = allocator

《Effective STL》重读笔记整理

喜夏-厌秋 提交于 2020-02-29 06:12:14
最近有闲,在工作之余重读了《effective STL》一书,并通过 twitter 记了一下笔记,今天整理收集到这里。 twitter 真的非常适合记读书笔记,哈哈,以后要好好地发扬。另,我的手机还是很老的 UIQ 3.0 的索爱手机,有没有达人推荐一些上推的应用程序?谢谢。 ==================================== #estl 第50条:熟悉与STL相关的web站点。三个:www.sgi.com/tech/stl、www.stlport.org 和 www.boost.org。 #estl 第49条:学会分析与STL相关的编译器诊断信息。嗯,第一招是替换大法,然后介绍了一下与容器、插入迭代器、绑定器、输出迭代器或算法相关的错误大概有什么套路看。 #estl 第48条:总是包含(#include)正确 的头文件。因为C++标准没有规定头文件的互相包含关系,所以不同的STL实现有所不同。要记住容器基本上声明在同名文件中,算法是algo..和 num..,迭代器在iterator中,函数子和配接器在functional中。 #estl 第47条:避免产生“直写型”(write-only)的代码。即所谓容易编写,但难以阅读和理解的代码,比如一行调用函数12次,其中 10 个是互不相同的。 #estl 第46条

STL源码剖析学习十:红黑树的实现

隐身守侯 提交于 2020-02-29 05:39:27
STL源码剖析学习十:红黑树的实现 RB-Tree的节点设计: 节点设计分为两层: struct __rb_tree_node_base { typedef __rb_tree_color_type color_type; typedef __rb_tree_node_base* base_ptr; color_typr color; base_ptr parent, left, right; static base_ptr minimun(base_ptr x) { while (x->left != 0) x = x->left; return x; } static base_ptr maximun(base_ptr x) { while (x->right != 0) x = x->right; return x; } }; template<class value> struct __rb_tree_node:public __rb_tree_node_base { typedef __rb_tree_node<value>* link_type; value value_field;//关键是把节点的值独立出来 }; RB-Tree的迭代器: 也分两层,和slist的设计比较相似,比较特殊的是前进和后退的操作。 struct __rb_tree_base

【STL源码剖析读书笔记】【第5章】关联式容器之RB-tree

守給你的承諾、 提交于 2020-02-29 03:09:05
1、 二叉树:任何节点最多只有两个子节点,这两个子节点分别称为左子节点和右子节点。 2、 二叉搜索树:任何节点的键值一定大于其左子树中的每一个节点的键值,小于其右子树中的每一个节点的键值。 3、 红黑树不仅是一个二叉搜索树,还必须满足以下条件: 1) 每个节点不是红色就是黑色。 2) 根节点为黑色。 3) 如果节点为红色,其子节点必须为黑色。 4) 任意一个节点到到NULL(树尾端)的任何路径,所含之黑色节点数必须相同。 根据规则4) ,新增节点必须为红色;根据规则3),新增节点之父节点必须为黑色。当新增节点根据二叉搜索树的规则到达其插入点时,却未能符合上述条件时,就必须调整颜色并旋转树形,如下图: 4、 红黑树插入节点 先为某些特殊节点定义一些代名: X 代表新节点, P 为其父节点, G 为其祖父节点, S 为其叔父节点, GG 为其曾祖父节点。 插入操作分为以下几种情况: 一、 P 为黑 直接插入 X ,操作完成。 二、 P 为红 情况 1 : S 为黑且 X 为外侧插入。 对 P , G 做一次右旋转操作并改变 P , G 的颜色,即可。 情况 2 : S 为黑且 X 为内侧插入。 对 P , X 做一次左旋转操作并改变 G , X 的颜色,然后再对 G 做一次右旋转操作,即可。 情况 3 : S 为红且 X 为外侧插入。 对 P , G 做一次右旋转操作改变 X 的颜色

STL源码剖析读书笔记-第4章

时光怂恿深爱的人放手 提交于 2020-02-29 03:05:36
第4章  序列式容器 容器是个大东西,还是带着问题分析好。 序列式容器里,我用的最多的还是vector。 1.我知道vector中有内存有预先分配,这种机制是好的,但有时候会浪费内存。 2.重点分析vector初始化大小,resize,erase等 vector容器 4.1.vector(n,v),使用这个构造函数可以指定含有n个v值的元素 看下源码: 构造函数 1 /** 2 * @brief Creates a %vector with copies of an exemplar element. 3 * @param n The number of elements to initially create. 4 * @param value An element to copy. 5 * @param a An allocator. 6 * 7 * This constructor fills the %vector with @a n copies of @a value. 8 */ 9 explicit 10 vector(size_type __n, const value_type& __value = value_type(), 11 const allocator_type& __a = allocator_type()) 12 : _Base(__n, __a)

STL源码剖析(deque)

夙愿已清 提交于 2020-02-29 03:04:58
deque是一个双向开口的容器,在头尾两端进行元素的插入跟删除操作都有理想的时间复杂度。 deque使用的是分段连续线性空间,它维护一个指针数组(T** map),其中每个指针指向一块连续线性空间。 (map左右两边一般留有剩余空间,用于前后插入元素,具体下面可以看到其实现) 根据上图,可以了解到deque的迭代器的基本定义。 1 template <class T, class Ref, class Ptr, size_t BufSiz> 2 struct __deque_iterator { 3 // 基本型别的定义 4 typedef __deque_iterator<T, T&, T*, BufSiz> iterator; 5 typedef random_access_iterator_tag iterator_category; 6 typedef T value_type; 7 typedef Ptr pointer; 8 typedef Ref reference; 9 typedef size_t size_type; 10 typedef ptrdiff_t difference_type; 11 typedef T** map_pointer; 12 typedef __deque_iterator self; 13 14 // 缓冲区的大小 15 tatic

STL中各类容器的API map

北城余情 提交于 2020-02-28 21:57:53
所有关联容器头提供一个insert,用以插入元素(键值对) 支持双向迭代器。 Map API map 的底层元素时指:(key,映射值)组成的pair对 映射值可以是任意的合法类型 其类型在map<key_type,X>::value_type 中定义 若typedef typename map<key_type,T>::value_type VALUE_TYPE; 构造函数: std::map<key_type,T>() 默认构造 增加元素: .insert(VALUE_TYPE(key,映射值)) .insert(std::pair<key_type,T>(key,映射值)) .insert(std::make_pair<key_type,T>(key,映射值)) 删除元素 .erase(指定迭代子位置的键值对) 改 排 查找元素: .find(key) 按关键字查找,找到返回key所在位置‘元素’(键值对)的迭代子。否则返回.end() 是否支持随机存取? 是 T& operator[](const KeyType&index) const T& operator[](const KeyType&index)const; 对于map,operator[]的过程如下: 当index对应的键不存在时,则生产一个元素(键值对)用于存放 元素的值(value==second)。

STL源码剖析学习八:heap & priority queue

…衆ロ難τιáo~ 提交于 2020-02-28 12:07:33
STL源码剖析学习八:heap & priority queue heap不是STL容器组件,但是作为priority queue的助手存在。 完全二叉树:整棵树除了最底层的叶节点之外,都是填满的,而最底层的叶节点从左至右不能有空隙。 好处是整棵树内没有任何节点漏洞,就可以用array表述整棵树(隐式表述法):将#0处保留,某个节点位于i处时,其左子节点必位于2i处,右子节点位于2i+1处,父节点位于2/i处。 为了满足动态改变容量的要求,用vector代替array。 push_heap: 先将新加入节点插在最底层最右边的位置,vector的end处 然后执行一个上溯的程序:把新节点与其父节点相比较,如果比它大就对换位置,直到到达根节点或者不需要对换为止。 在实现中vector的#0位置不保留,i的父节点为(i-1)/2 pop_heap 最大值在根节点,取走根节点(其实设置底部vector的尾端节点) 割舍最下层最右边的那个叶节点 执行下溯程序:将空节点和他较大的子节点对调位置,并且持续下放,直到到达叶节点位置,将之前被割舍的元素值赋给这个空洞节点,再对他进行一次上溯程序即可 pop_heap之后,最大元素只是被放置在底部容器的最尾端,尚未被取走,如果要取值,可以用vector的back操作,如果要移除可以用pop_back操作。 sort_heap 每次pop

Boost.Asio without Boost.System

為{幸葍}努か 提交于 2020-02-28 08:24:31
问题 On the Boost System page it is stated that: The Boost System Library is part of the C++11 Standard Library. But a number of Boost libraries, such as Asio, depend on Boost System. Is it possible to use the C++11 std stuff instead of Boost System to work with Asio? 回答1: AFAIR you can configure Boost System to be header-only Source: http://www.boost.org/doc/libs/1_66_0/libs/system/doc/reference.html Other than that, you might simply use Non-Boost Asio 来源: https://stackoverflow.com/questions

STL Vector 的遍历删除

你。 提交于 2020-02-28 07:03:48
转载自: http://www.cppblog.com/Khan/archive/2009/12/08/102793.html Vector 其实就类似动态数组. 事先分配好一定量的内存. 当需要的内存值大于某个阀值. 就重新申请内存. 重新分配. 当小于某个阀值, 也会导致重新分配.(自动收缩部分, stl没有明确规定, 有些库实现了) 正确: code1 vector<string> vecFiles; vector<string>::iterator it_pos; //@todo 已下载文件过滤 for (it_pos = vecFiles.begin(); it_pos != vecFiles.end(); ) { string strTmp = *it_pos; if( objDownHis.checkHisList( strTmp.c_str() ) ){ //判断是否已下载过, 已下载则从列表删除 g_Log << TIME << "file:[" << *it_pos << "] found "<< END; // vecFiles.erase(it_pos++); }else it_pos++; } 正确: code2 vector<string> vecFiles; vector<string>::iterator it_pos; //@todo