
C PlusPlus
文章平均质量分 79
有时需要偏执狂
一定要搞懂,千万不要心存侥幸,否则一些问题会让你痛苦不堪(源码面前,了无秘密)。
拥有一某三分地不容易,贵在坚持。
展开
-
STL中迭代器与traits编程的技巧
迭代器设计模式1、什么是迭代器? 一种抽象的设计概念,iterator模式定义就是提供一种方法,使之能够依序访问某个容器所有的各个元素,而又不用暴露容器内部的表达方式。2、迭代器如何实现? 在内部就是通过指针实现迭代器,将编程全部泛化,抽象出共同拥有的东西,可以提供类似指针的操作,实质上就是操作符重载,实现对容器内部数据的操作功能。在STL中,如果将迭代器独立出来设计,那...原创 2018-01-16 21:42:26 · 408 阅读 · 1 评论 -
STL之queue实现详解
队列承接上节栈的讲解,因为实现的list和dqueue这种双进双出的底层容器,那么对于queue这种适配器,实现起来就非常简单了。queue具有先进先出的数据结构。仅仅支持新增元素、移除元素、从最底端加入元素、取最顶端元素。这些方法而已。只要细心分析了deque,这个适配器就很容易了。 STL-queue实现起来非常简单,那么直接给出源代码,解释其中比较重要的地方。 队列不提供迭代...原创 2018-03-15 21:35:22 · 7040 阅读 · 0 评论 -
3章 Data语意学
继承与Data Member1、单一继承且不含虚函数 2、单一继承并含虚函数 3、多重继承 4、虚拟继承原创 2018-01-12 15:49:00 · 250 阅读 · 0 评论 -
2章 构造函数语意学
占位符原创 2018-01-12 15:11:34 · 257 阅读 · 0 评论 -
C++多态及虚析构函数
14、M24、M26、33、35和M33、36 http://blog.youkuaiyun.com/lihao21/article/details/50688337 http://blog.jobbole.com/103102/C++实现多态 多态:支持相关的对象具有不同的成员函数(但原型相同) ,并允许对象与适当的成员函数进行运行时绑定。虚表和虚表指针介绍 当调用一个虚函数时...原创 2018-02-10 22:13:55 · 431 阅读 · 0 评论 -
避免对指针和数字类型重载以及潜在的二义性
指针和数字类型都是数字,避免重载两种类型,否则可能产生不可避免的麻烦。原创 2018-02-27 20:07:58 · 323 阅读 · 0 评论 -
类设计与声明之实现string类
占位,实现简单的mystring,结合高效编程。 http://blog.youkuaiyun.com/yusiguyuan/article/details/45816531原创 2018-02-27 19:51:08 · 1066 阅读 · 0 评论 -
类设计与声明之实现有理数类
占楼,学习并设计规则。 http://blog.youkuaiyun.com/qq_38238112/article/details/77416146 http://blog.youkuaiyun.com/chenkangli/article/details/489725 https://www.cnblogs.com/laizhenghong2012/p/8457784.html http://blog.csd...原创 2018-02-27 16:37:52 · 2443 阅读 · 0 评论 -
类设计与声明之实现用户自定义下标上下限的数组
占楼。。设计并技术高效编程的规则。原创 2018-02-27 16:36:59 · 384 阅读 · 0 评论 -
赋值运算符重载(operator=)注意事项
1、返回*this引用类中定义自己的赋值运算符时,必须返回赋值运算符左边参数的引用( *this)。如果不这样做,就会导致不能连续赋值,或导致调用时的隐式类型转换不能进行,或两种情况同时发生。string& operator=(const string& rhs)//string赋值运算符一种形式{ return *this;}string w, x, y, ...原创 2018-02-27 11:10:03 · 3973 阅读 · 0 评论 -
Boost之smart_ptr
如果对象是用声明的方式在栈上创建的( 一个局部对象),那么RAII机制会工作正常,当离开作用域时对象会自动销毁从而调用析构函数释放资源。但如果对象是用new操作符在堆上创建的,那么它的析构函数不会自动调用,程序员必须明确地用对应的 delete 操作符销毁它才能释放资源,这非常容易造成内存泄漏的问题,所以Boost提供了6种智能指针用于解决这种问题,包括scoped_ptr、scoped_a...原创 2018-02-09 15:27:04 · 285 阅读 · 0 评论 -
Boost库 boost::circular_buffer、boost::ptr_vector
1、boost::circular_buffer circular_buffer为了效率考虑,使用了连续内存块保存元素。然后循环使用这段空间。使用固定内存,没有隐式或者非期望的内存分配。快速在circular_buffer头或者尾部插入,删除元素,并且是常量时间复杂度,常量时间访问元素。适合实时和对性能要求苛刻的应用。可用作底层容器实现固定大小buffer,例如实现有界阻塞队...原创 2018-02-09 22:16:27 · 702 阅读 · 0 评论 -
初始化列表问题
1、多多使用初始化列表进行初始化const和引用数据成语只能初始化,不能被赋值对于含有基类的类,基类构造函数总是被调用。当有大量的固定类型的数据成员需要初始化的时候,可以使用在构造函数体内铜鼓赋值初始化,简化设计。templateclass T>class NamedPtr {public: NamedPtr(const string& initName, T *i原创 2018-02-05 11:33:37 · 375 阅读 · 0 评论 -
STL之heap实现详解(内部使用)
堆先前的文章已经对堆说得足够清楚了,可以参考。 可以参考 libevent之最小堆 经典排序算法堆无非就是分为最大堆(父节点大于等于子节点)和最小堆(父节点小于等于子节点)。STL里面实现的都是最大堆。还有就是堆一般通过数组实现。那么问题就有两个。假如不用数组索引0的位置,那么算法会很简单,那么N的父节点索引就是N/2;N的左右子节点分别是2N和2N+1。假如使用了索引0位置,那么N...原创 2018-03-16 22:09:05 · 2121 阅读 · 1 评论 -
STL之list实现详解
STL中的list容器底层数据结构用的是双向链表。这样数据在存储和删除的时候都可以做到时间复杂度是O(1)。但是由于其存储空间并不是连续的,所以导致在里面查找数据会很不容易。1、介绍list如何使用的demo#include <iostream>#include <list>#include <algorithm>#include <...原创 2018-03-11 21:30:06 · 1466 阅读 · 0 评论 -
STL之仿函数实现详解
1、何为仿函数仿函数的主要功能是为了搭配STL算法使用,单独使用仿函数的情况比较少。 仿函数(functors)在C++标准中采用的名称是函数对象(function objects)。仿函数主要用于STL中的算法中,虽然函数指针虽然也可以作为算法的参数,但是函数指针不能满足STL对抽象性的要求,也不能满足软件积木的要求–函数指针无法和STL其他组件搭配,产生更灵活变化。仿函数本质就是类重载了...原创 2018-03-28 21:34:19 · 23090 阅读 · 4 评论 -
C++虚函数要点合集
参考: https://blog.youkuaiyun.com/lihao21/article/details/506883371、动态类型与静态类型静态类型:指不需要考虑表达式的执行期语义,仅分析程序文本而决定的表达式类型。静态类型仅依赖于包含表达式的程序文本的形式,而在程序运行时不会改变。通俗的讲,就是上下文无关,在编译时就可以确定其类型。 动态类型:基类的指针和基类引用有可能为动态类型,就是...原创 2018-04-03 22:09:15 · 565 阅读 · 0 评论 -
Lazy Evaluation
1、引用计数 M29 2、区别对待读取和写入 M30 3、Lazy Fetching(懒惰提取) 4、懒惰表达式计算原创 2018-04-02 21:10:08 · 472 阅读 · 0 评论 -
STL之算法模板函数实现详解
1、<algorithm>1、transformtemplate <class InputIterator, class OutputIterator, class UnaryOperation>OutputIterator transform(InputIterator first, InputIterator last, ...原创 2018-04-09 21:39:46 · 619 阅读 · 0 评论 -
STL之set和multiset、 map和multimap详解
基本用法参考这篇,本篇主要讲解内部实现过程。set和multiset介绍set/multiset以底层红黑树为结构,set的key和value是合一的,value就是key,因此通过比较key插入平衡二叉树,因此可以可以通过迭代器,从小到大输出key,也就是所谓的自动排序,二叉树以及排好序了。禁止通过迭代器修改key,否则二叉树结构变化了。特性和set集合差不多,唯一的区别就在于允许键...原创 2018-03-21 19:03:04 · 1478 阅读 · 0 评论 -
STL之hash_set和hash_multiset、hash_map和hash_multimap详解
hash_set1、介绍 虽然STL只规范复杂度和接口,并不规范实现方法,但STL set多半以RB-tree为底层机制。SGI在标准之外提供了hash_set,以hashtable作为底层机制。用set为的是能快速搜寻元素。这一点无论底层是RB-tree还是hashtable都能实现。但RB-tree有自动排序能力(二叉树特性)而hashtable(肯定没有啊)没有,其结果就是set元...原创 2018-03-24 22:06:47 · 763 阅读 · 0 评论 -
STL之hashtable详解
hash介绍前面讲解二叉树实现键和值的存储。平衡二叉树就是插入和搜寻的速度非常快。那么我们是否可以使用一种方法,将键和值都存在在一段连续的空间内呢?可以,我们只需要将键通过一个函数映射成一个整数即可。这样在时间和空间上面做到了平衡,因为查找很快,索引也很快。关键在于散列函数和碰撞处理,很简单,具体可以参考。 **碰撞处理主要是线性分离(通过链表处理)和线性探测。**SGI-STL采用了线性分...原创 2018-03-24 21:24:02 · 4137 阅读 · 2 评论 -
STL之stack实现详解
STL栈介绍stack是先进先出,没有迭代器,只允许push和pop操作以及读取和修改栈顶top元素的操作。由于stack利用了底层容器实现工作,所以称之为配接器而已。 栈的完整定义#define __STL_NULL_TMPL_ARGS <> //模板传入的是一个类template <class T, class Sequence = deque<T...原创 2018-03-13 14:57:28 · 3274 阅读 · 1 评论 -
STL之deque实现详解
何为dequedeque是双向开口的连续线性空间(动态将多个连续空间通过指针数组接合在一起),随时可以增加一段新的空间,所以数据想vector里面的分配,复制,释放操作不会发生。deque头尾两端分别做插入和删除操作都是常数时间。能用vector尽量使用vector,通过deque用来做队列即可,十分方便的。不浮躁,慢慢看,就会理解其中的奥妙。 花了半天的时间仔细看了一遍SGI-STLd...原创 2018-03-13 14:56:27 · 30368 阅读 · 7 评论 -
区分接口继承和实现继承
这里主要是理解基类中声明为纯虚函数、虚函数、和非虚函数的区别,主要是为了告诉派生类什么信息呢?原创 2018-03-22 17:02:15 · 343 阅读 · 0 评论 -
STL之tree的实现详解
1、红黑树介绍关联容器都有一个key(键)和一个value(值)。当元素被插入到关联式容器中时,内部结构依照其键值的大小,以特定的规则将元素放到合适的位置(实现查找算法吧)。 一般关联时容器内部结构是一个平衡二叉树,用于在恶劣的环境下获得良好的搜寻效率。平衡二叉树的实现有:AVL-tree、RB-tree、AA-tree。用的最广的就是RB-tree,不论是在Nginx还是Linux内核任务...原创 2018-03-17 21:46:27 · 11525 阅读 · 1 评论 -
STL之priority_queue实现详解
优先队列优先队列可以从尾部插入元素,然后从头部取出优先级(通过一个数值表示)最高的对象。这种支持插入,然后每次仅仅取出一个对象数据结构,完全天然和堆一一对应,所以通过堆实现优先队列适配器是天然的选择。也就是说最大堆其实就是优先队列。优先队列没有迭代器,进出都有一定的规则,只有queue顶端的元素(权重最高者),才有机会被外界取用。STL源码#ifndef __STL_LIMIT...原创 2018-03-17 21:21:39 · 1498 阅读 · 0 评论 -
Muduo之封装CurrentThread、Thread、ThreadPool
基础知识1、CurrentThread2、Thread3、ThreadPool大多数的网络服务器,包括Web服务器都具有一个特点,就是单位时间内必须处理数目巨大的连接请求,但是处理时间却是比较短的。在传统的多线程服务器模型中是这样实现的:一旦有个请求到达,就创建一个新的线程,由该线程执行任务,任务执行完毕之后,线程就退出。这就是”即时创建,即时销毁”的策略。尽管与创建进程相比,...原创 2018-02-09 11:04:05 · 598 阅读 · 0 评论 -
Boost库function和bind的使用
1、bind2、function原创 2018-02-09 12:06:20 · 217 阅读 · 0 评论 -
STL之vector实现详解
array、list、tree、stack、queue、hash table、set、map这些全部都是数据结构,根据数据在容器之中的排列特性,这些数据结构分为序列式和关联式两种。 序列式容器就是其中的元素都是可序的但是不一定有序。vector首先从一个简单例子入手,说明vector如何是使用的。vector使用示例include<vector>#i...原创 2018-01-20 10:40:03 · 1269 阅读 · 3 评论 -
C++ primer 12章 动态内存
这一章,由于本身对C语言动态分配以及指针比较熟悉,所以看起来会很轻松的。自动分配,static分配,以及动态分配对象,动态分配对象的生存期和在哪来创建无关,只有被显式地被释放,对象才销毁,不占用对应的内存空间。静态内存保存局部static对象,类static数据成员,以及定义在任何函数之外的变量。栈用来保存函数内的非static对象,静态内存和栈由编译器管理。每个程序还有堆,则由程序员管理。运算原创 2018-01-02 20:00:37 · 369 阅读 · 0 评论 -
9章 顺序容器
占位,占住12月份的写作量。原创 2017-12-28 21:26:33 · 217 阅读 · 0 评论 -
8章 IO库
占位,占住12月份的写作量。原创 2017-12-28 21:26:01 · 156 阅读 · 0 评论 -
C++ 14章 操作符重载与类型转换
占位,占住12月份的写作量。原创 2017-12-28 21:22:44 · 246 阅读 · 0 评论 -
1章 关于对象
占位符原创 2018-01-12 15:10:44 · 147 阅读 · 0 评论 -
C++ Primer 3章 字符串、向量和数组
using声明既可以直接声明命名空间 using namespace std,也可以声明命名空间里面的某个方法using std::cin。标准库类型string//使用=初始化一个变量,是拷贝初始化,编译器把等号右侧初始值拷贝到新对象中去。string s0;//s0默认为空字符。string s3 = "value";//s3是"value"的副本,出字面值最后一个空字符外。string原创 2017-08-24 20:14:43 · 448 阅读 · 0 评论 -
C++ 18章 大型程序常用工具
占位符好原创 2018-01-09 22:05:01 · 354 阅读 · 0 评论 -
C++ Primer 第六章 函数
函数有的输入参数是形参,实参是形参的初始值,实参类型必须和形参类型匹配。int main(void)显示定义没有形参。形参作用域是函数块内。原创 2017-09-02 16:38:54 · 369 阅读 · 0 评论 -
C++的一些小把戏
打造深入理解C++系列。原创 2017-11-04 20:56:26 · 337 阅读 · 0 评论 -
C++ Primer 第四章 表达式
多余两句语句的if后面,记得加上大括号控制执行路径。C++case标签自由,可以将标签写到一行,表示case代表某个范围内的值。尽量不要省略case分支后面的break语句。switch(ch){ case 'a': case 'e': case 'i': case 'o': case 'u': ++Cnt;原创 2017-09-01 15:28:48 · 213 阅读 · 0 评论