C++11 中的右值引用和移动语义
右值引用
C++11 引入,所谓右值引用,赋予了程序员修改右值的能力。在引入右值引用之前,是没有办法修改这个右值的,也即这个右值所在地址中的值不能被修改,只能一直是这个右值(可能存在一个误区:右值不能取地址,但不代表右值没有地址):
c++12int &x = 5; // Err ...
C++ STL 中的 Algorithm
STL Algorithm 中的函数前两个入参一般都是迭代器,表示 [begin, end) 中的一段数据
numeric
函数名
作用
accumulate
将一段数据累加起来(可自定义二元运算)
adjacent_difference
将一段数据相邻元素作差,结果存放到另一段( ...
C++ STL 中的 Allocator
STL Allocator 定义了两个主要的配置器,每个配置器都实现了公有方法 allocate, deallocate 以及 reallocate。其中第一级配置器(__malloc_alloc_template)的实现较为简单,allocate 直接调用 malloc,deallocate 直 ...
C++ 中的拷贝构造函数和赋值运算符的重载
概念C++ 的空类默认会有默认构造函数、析构函数、拷贝构造函数以及赋值函数(赋值运算符重载)(C++ 11 前)
拷贝构造函数和赋值函数接受一个该类对象的引用作为入参。拷贝构造函数入参必须是引用,不能是值传递,如果拷贝构造函数入参是值传递的话,传值的过程本身要调用一次拷贝构造函数,就无限循环了。
...
B 树、B+ 树和 B* 树
B 树
B 树即 B-Tree,所以也叫 B- 树,也是一种自平衡搜索树,但他是多路查找树,也即多叉树。因为像 AVL 树,红黑树这样的自平衡二叉查找树在使用的时候往往认为数据都是存在内存里的,而 B 树的使用场景中往往数据很多,需要存在磁盘中,而对于查找这样的操作,每访问一次树节点就需要读一次磁盘 ...
二叉搜索树和平衡二叉树
二叉搜索树(BST)
对于每个节点,左子树中所有值均小于自己,右子树中所有值均大于自己。中序遍历一棵 BST,即能得到有序的数据。
所以对于查找来说,将相当于是根据中序遍历的结果进行操作:
查找指定 key:当前节点小于 key,向右查找,否则向左查找。
查找最小 key:不停向左查找。
查找后继: ...
C++ 中的 new 关键字
operator new 函数operator new 作为一个 global namespace 下的普通函数,有三个重载:
c++123void* operator new (std::size_t size);void* operator new (std::size_t size, cons ...
设计模式总结
创建型
单例(Singleton):私有构造函数,私有静态变量,公有静态函数
简单工厂(Simple Factory):把实例化的操作放到单独的类中,让这个类来决定如何实例化(例如用哪个子类)
工厂方法(Factory Method):在简单工厂中,创建对象的是另一个类,而在工厂方法中,是由子类 ...
waitpid status 参数解析
waitpid(pid_t pid, int *status, int options) 的第二个参数用来标识导致 waitpid 返回的子进程的状态,一般而言这是一个 32 位的量(也有例外,比如 ptrace event 会用到更高位的字节来标识 event),有以下四种情况(应该是和编译器实现 ...
C++ 中的 virtual 关键字和对象的内存布局
虚函数、虚表、虚指针
一个类中,数据成员(除了静态)存放在堆栈上,静态数据成员存放在数据段,函数(包括静态和非静态)存放在代码段。
如果一个类定义了虚函数或是该类的父类定义了虚函数,那么一个指向虚表的指针(_vptr) 会被编译器添加到该类对象的栈上(就好像这个指针也是该类的一个成员变量)。
注意 ...