侯捷C++学习(一)】的更多相关文章

layout: post title: 侯捷STL学习(12) date: 2017-08-01 tag: 侯捷STL --- 第四讲 STL相关的内容 Hash Function 将hash函数封装成类对象 hash_val进行拆解传入参数,进行循环 每次拆解一个参数,都需要更新种子 TR1的工具,)0x9e3779b9是黄金比例数字0.618 测试 当没有指定hash函数时,用默认的hash函数,但是针对特殊的类型,有自己特化的hash函数 tuple用例 测试 实现,递归的继承实现自动添加…
layout: post title: 侯捷STL学习(十一) date: 2017-07-24 tag: 侯捷STL --- 第三讲 标准库内核分析-算法 标准库算法形式 iterator分类 不同容器iterator类型不同 测试iterator类型 #include <iostream> // std::cout #include <iterator> // std::iterator_traits #include <typeinfo> // typeid na…
layout: post title: 侯捷STL学习(十) date: 2017-07-23 tag: 侯捷STL --- 第二十三节 容器hashtable探索 hashtable冲突(碰撞)处理 rehash时,篮子扩充两倍,找到其附近的质数,重新计算元素位置 内部扩充的数据已经预定好,53->97->.... hashtable实现 iterator要实现当当前node链表结束,要能进入到下一个buckets hashtable使用 模板参数的形式 容器hashtable中hashfu…
layout: post title: 侯捷STL学习(九) date: 2017-07-21 tag: 侯捷STL --- 第十九节 容器rb_tree Red-Black tree是自平衡二叉搜索树. rb_tree的封装 清楚传入模板的参数列表:然后构建了一个虚空结点header KeyOfValue表示怎么从value中取出key identity函数(Gnu C独有)就是表示同一个数的意思 handle-body,采用OOP的思想,构建G4.9 一个红黑树的大小为4个字节 test R…
layout: post title: 侯捷STL学习(八) date: 2017-07-19 tag: 侯捷STL --- 第十八节 深度探索deque上 duque内存结构 分段连续,用户看起来是连续的 迭代器为了维持连续的状态,每次++,--都需要判断当前buffer是否用完,若用完则需要通过控制中心跳到下一个buffer 控制中心的map是指向vector的,以后也是2倍增长 deque iterator迭代器实现,关键有指向map的指针 deque<T>::insert讲解 很好体现…
layout: post title: 侯捷STL学习(七) date: 2017-06-13 tag: 侯捷STL --- 第十六节 深度探索vector vector源码剖析 vector内存2倍扩充,是在另外的地方重新申请内存,将数据搬过去 前闭后开区间 2倍扩充方法,reallocation insert_aux函数中再次判断,原因是可能有其他放元素的操作如insert 也要拷贝插入之后的数据,考虑到insert插入某个位置,红色框部分 vector's iterator vector结…
开始跟着<STL源码剖析>的作者侯捷真人视频,学习STL,了解STL背后的真实故事! 视频链接:侯捷STL 还有很大其他视频需要的留言 第一节:STL版本和重要资源 STL和标准库的区别 三个网站 CPlusPlus CppReference gcc.gnu.org Boost 第二节:STL六大部件 迭代器将容器和算法结合起来 分配器实现,适配器用的地方很多 实例: 理解容器的前闭后开的设计.迭代器类似于指针,很多操作和指针差不多++,--运算.vec.begin(),vec.end()指向…
开始跟着<STL源码剖析>的作者侯捷真人视频,学习STL,了解STL背后的真实故事! 视频链接:侯捷STL 还有很大其他视频需要的留言 第一节:STL版本和重要资源 STL和标准库的区别 三个网站 CPlusPlus CppReference gcc.gnu.org Boost 第二节:STL六大部件 迭代器将容器和算法结合起来 分配器实现,适配器用的地方很多 实例: 理解容器的前闭后开的设计.迭代器类似于指针,很多操作和指针差不多++,--运算.vec.begin(),vec.end()指向…
第十一节 分配器 分配器的好坏影响到容器的性能 operator new()里面调用malloc D:\Program Files (x86)\Microsoft Visual Studio 12.0\VC\crt\srcvc下的源代码路径 分配的内存要比申请的内存大 所以VC6.0下的allocator没有优化 // newop operator new(size_t) for Microsoft C++ #include <cstdlib> #include <new> #in…
第十一节 分配器 STL源码学习----内存管理 分配器的好坏影响到容器的性能 operator new()里面调用malloc D:\Program Files (x86)\Microsoft Visual Studio 12.0\VC\crt\srcvc下的源代码路径 分配的内存要比申请的内存大 所以VC6.0下的allocator没有优化 // newop operator new(size_t) for Microsoft C++ #include <cstdlib> #include…
//c++学习//标准库非常重要//要规范自己的代码complex c1(2,1);complex c2;complex* pc = new complex(0,1);string s1("Hello");string s2("world");string* ps #include<iostream>using namespace std;int main() { int i=7; cout<<"i="<<i&…
第六节:容器之分类和各种测试(四) stack不提供iterator操作,破坏了容器的独特性,先进先出. 使用容器multiset(允许元素重复) 内部是红黑树,insert操作就保证了排好了序. 标准库有个::find()函数,大家都可以用.容器本身也有一个c.find(),通过键值对查找非常快! 测试 #include <set> #include <stdexcept> #include <string> #include <cstdlib> //ab…
http://www.cnblogs.com/ranjiewen/category/799058.html http://www.cnblogs.com/ranjiewen/p/8260275.html     STL的一些技巧函数使用…
第十三,四节 深度探索list(上,下) list Gnu2.9源代码实现 注意node代码和图示的位置 实现前闭后开,增加一个空白节点 用的分配器alloc Iterator智能指针,需要知道结点node的next指针 除了array和vector,其他容器的iterator都是一个class iteratorclass 实现 必须做至少5个typedef,很多操作符重载 前++++i其中i作为对象,self& operator++(){}返回引用,这样可以进行两次前++ 后++ i++ se…
C++标准库第二讲 体系结构与内核分析 第1-7节为第一讲 读源代码前的准备 第八节:源代码分布 C++基本语法 模板的使用 数据结构和算法 本课程主要使用:Gnu C 2.9.1与Gun C 4.9 VS2013中源代码的地址D:\Program Files (x86)\Microsoft Visual Studio 12.0\VC\include 第九节:OOP(面向对编程) VS GP(泛型编程) OOP将数据data和方法methods合在一起 list不能像vector,deque一样…
第七节:分配器测试 标准的分配器Allocator,#include<ext/...>都是拓展的 可以用不同的分配器测试同一容器 分配器allocate() & deallocate()进行内存的分配和释放,这样操作太麻烦了 实际用到得new delete malloc free释放时并没有指定分配产生的字节 关于分配器实现需要后续的源码分析 测试 #include <list> #include <stdexcept> #include <string&…
第六节:容器之分类和各种测试(四) stack不提供iterator操作,破坏了容器的独特性,先进先出. 使用容器multiset(允许元素重复) 内部是红黑树,insert操作就保证了排好了序. 标准库有个::find()函数,大家都可以用.容器本身也有一个c.find(),通过键值对查找非常快! 测试 #include <set> #include <stdexcept> #include <string> #include <cstdlib> //ab…
#include <iostream>using namespace std;class complex{ public: complex (double r= 0, double i = 0) :re (r) , im(i) { } complex operator += (const complex& c) { this->re = c.re + this->re; this->im = c.im + this->im; return * this; } d…
一.容器概览 上图为 GI STL 2.9的各种容器.图中以内缩方式来表达基层与衍生层的关系.所谓的衍生,并非继承(inheritance)关系,而是内含(containment)关系.例如 heap 内含一个 vector,priority-queue 内含一个 heap,stack  和 queue 都含一个 deque,set/map/multiset/multimap 都内含一个 RB-tree,hast_x都内含一个 hashtable. 二.序列式容器(sequential cont…
以STL 的运用角度而言,空间配置器是最不需要介绍的东西,它总是隐藏在一切组件(更具体地说是指容器,container)的背后,默默工作默默付出. 一.分配器测试 测试代码 #include <list> #include <stdexcept> #include <string> #include <cstdlib> //abort() #include <cstdio> //snprintf() #include <algorithm&…
侯捷的<深入浅出mfc>相信大家都已经很熟悉了,论坛上也有很多介绍,这里我就不多说了. 而李久进的<mfc深入浅出>,听说的人可能就少得多.原因听说是这本书当时没有怎么宣传,而自从1999年第1版后,似乎也没有重印过,现在市面上根本找不到,所以大部分人都不知道.我手里现在恰好有一本,是从图书馆借的.这本书全名为<mfc深入浅出——从mfc设计到mfc编程>李久进编著,华中理工大学出版.此书极佳! 我这本书是1999年9月第一版,印数居然只有5000册.这么好的书只印50…
与我研究VCL框架代码的原因一模一样:就是N年了,感觉自己还是没有掌握Delphi,惊叹别人各种各样神奇的效果,自己却不会,更不知为什么这样做,离高手的距离还有十万八千里.而且编程的时候,就像侯捷说的那样:自己只是像傻子一样地东一个按钮,西一个按钮,东编一点码,西编一点码,很愚蠢,却又不得不这样做. 最近仔细看了VCL代码,才算大致明白了为什么要这样做,而且还没全明白.即使简单如Label1.Caption:='Hello World';或者Button1.Caption:='Hello But…
泛型編程編出來的代碼,適用於任何「吻合某種條件限制」的資料型別.這已成為撰寫可復用代碼時的一個重要選擇.然而,總有一些時候,泛型不夠好 — 有時候是因為不同的型別差距過大,難以產生一致的泛化實作版本.這個時候 traits(品质,特性意思) 技術就變得相當重要.這種技術可以將那些需要被納入考量的型別性質以一種 type by type 的原則,封裝於一個 traits class 內,於是可以將「由於型別之間的差異,必須撰寫出來以備用」的代碼體積降至最低,並使泛用代碼的體積提昇到最高. 考慮一個…
list源码1(参考STL源码--侯捷):list节点.迭代器.数据结构 list源码2(参考STL源码--侯捷):constructor.push_back.insert list源码3(参考STL源码--侯捷):push_front.push_back.erase.pop_front.pop_back.clear.remove.unique list源码4(参考STL源码--侯捷):transfer.splice.merge.reverse.sort transfer list内部提供一个所…
list源码1(参考STL源码--侯捷):list节点.迭代器.数据结构 list源码2(参考STL源码--侯捷):constructor.push_back.insert list源码3(参考STL源码--侯捷):push_front.push_back.erase.pop_front.pop_back.clear.remove.unique list源码4(参考STL源码--侯捷):transfer.splice.merge.reverse.sort list概述 list相对于vector…
list源码1(参考STL源码--侯捷):list节点.迭代器.数据结构 list源码2(参考STL源码--侯捷):constructor.push_back.insert list源码3(参考STL源码--侯捷):push_front.push_back.erase.pop_front.pop_back.clear.remove.unique list源码4(参考STL源码--侯捷):transfer.splice.merge.reverse.sort list的push_back.inser…
list源码1(参考STL源码--侯捷):list节点.迭代器.数据结构 list源码2(参考STL源码--侯捷):constructor.push_back.insert list源码3(参考STL源码--侯捷):push_front.push_back.erase.pop_front.pop_back.clear.remove.unique list源码4(参考STL源码--侯捷):transfer.splice.merge.reverse.sort push_front() //插入一个节…
vector源码1(参考STL源码--侯捷) vector源码2(参考STL源码--侯捷):空间分配.push_back vector源码(参考STL源码--侯捷)-----空间分配导致迭代器失效 vector源码3(参考STL源码--侯捷):pop_back.erase.clear.insert pop_back //删除尾部元素,调整大小 void pop_back(){ --finish; //尾端标记往前一格,表示放弃尾部元素 destroy(finish); } erase //清除(…
vector源码1(参考STL源码--侯捷) vector源码2(参考STL源码--侯捷) vector源码(参考STL源码--侯捷)-----空间分配导致迭代器失效 vector源码3(参考STL源码--侯捷):pop_back.erase.clear.insert #include<bits/stdc++.h> using namespace std; int main(){ vector<,); vector<int>::iterator it=v.begin(); c…
vector源码1(参考STL源码--侯捷) vector源码2(参考STL源码--侯捷) vector源码(参考STL源码--侯捷)-----空间分配导致迭代器失效 vector源码3(参考STL源码--侯捷):pop_back.erase.clear.insert vector的构造和内存管理 vector所采用的数据结构非常简单:线性连续空间,它是由两个迭代器start和finish分别指向配置得来的连续空间中目前已被使用的范围,并以迭代器end_of_storage指向整块连续空间(含备…