摘要:
git submodule应用 开发软件时,自己开发的某个项目/模块可能依赖于其他模块或第三方库。自己那部分代码是一个独立代码仓库,并不想把依赖的模块或第三方库直接放到代码库中,但是本地编译的时候又需要用到。此时,希望在本地能实现自动将依赖的模块或第三方库拉取到项目指定目录中。 这里介绍一种适用于g 阅读全文
摘要:
boost::any简介 C语言中有void*指针用于存放、传递任意类型数据,C++中呢? boost库就提供了这样一个类:boost::any,一个很短小的类,主要作用是定义一个变量存放任意类型的数据。 boost::any用法 可以在存储的时候,将要存储的对象类型转换为boostany类型,而要 阅读全文
摘要:
deque vs vector vector是单向开口的连续线性空间,适合在尾端插入、删除元素,O(1);deque是双向开口的连续线性空间,适合在头尾两端分别进行元素的插入和删除操作,O(1)。 vector也可以在头尾插入、删除元素,不过在头部操作的效率非常低,O(n)。 可以指定,deque和 阅读全文
摘要:
并查集原理 如果某个部落过于庞大,则部落成员见面可能不认识。已知某个部落成员关系图,任意给出其中两个人,判断是否有亲戚关系。规定:1)若x、y是亲戚,y和z是亲戚,则x和z也是亲戚;2)若x、y是亲戚,则x的亲戚也是y的亲戚,y的亲戚也是x的亲戚。 如何才能快速判断2个人是否有亲戚关系? 以上第1) 阅读全文
摘要:
priority_queue简介 跟普通queue不同的是,priority_queue拥有权值的概念,允许加入新元素、移除旧元素、查看元素值等。priority_queue本身也是一个queue,因此只允许在尾部加入元素,头部取出元素,除此外无法从别的位置存取元素。 普通queue是按先进先出的规 阅读全文
摘要:
heap简介 heap不是STL容器组件,而是为了辅助priority queue(优先队列)。priority queue允许用户以任何次序将任何元素推入容器内,但取出时一定是从优先权最高(即数值最大)的元素开始取。二叉最大堆(binary max heap)正具有这样的特性,适合作为priori 阅读全文
摘要:
queue简介 队列queue是一种先进先出(FIFO)的数据结构。有2个出口:允许从头部移除、查询元素,从尾部加入元素。除此之外,无法存取其他位置元素,也不允许遍历。 将元素推入queue的操作称为push,将元素推出queue的从中称为pop。 queue的数据结构 类似于stack,queue 阅读全文
摘要:
stack简介 栈stack是一种先进后厨(FILO)的数据结构,只有一个出口,即栈顶。stack支持新增元素、移除元素、取得栈顶元素,但都是针对栈顶元素的操作,无法存取其他位置元素。 也就是说,stack不支持不影响栈结构的遍历操作。 将元素插入stack的操作称为push,将元素从stack移除 阅读全文
摘要:
vector vs array 在SGI STL中,vector和array都是数组容器,两种操作非常相似。区别在于:array是静态空间,一旦配置就不能改变;vector是动态空间,随着新元素加入,内部机制或自行扩充空间以容纳新元素。 vector的迭代器 vector维护的是一个连续线性空间,不 阅读全文
摘要:
__type_traits基本概念 iterator_traits是STL针对迭代器加以规范,用来萃取迭代器特性的机制。SGI STL把这种技法扩大到迭代器以外的地方,于是有了__type_traits。(双下划线表示是内部所用,不在STL标准规范内) iterator_traits 提供机制,用于 阅读全文
摘要:
迭代器的设计思想 GoF提到iterator设计模式: 提供一种方法,使之能依序巡访某个聚合物(容器)所含的各个元素,而又无须暴露该聚合物的内部表述方式。 STL中的iterator(迭代器)正是践行了这些设计模式,其中心思想:将数据容器(containers)和算法(algorithm)分离开,彼 阅读全文
摘要:
内存基本处理工具 STL定义5个全局函数,并非空间配置器的内容,但作用于未初始化空间(空间配置器alloc配置的空间)上,对容器实现有帮助。 5个函数分别是: 1)construct()用于构造; 2)destroy()用于析构的; 3)uninitialized_copy(),对应于高层次函数st 阅读全文
摘要:
空间配置器 基本概念 为什么叫allocator空间配置器,而不叫内存配置器? 因为空间不一定是内存,也可能是磁盘或其他辅助存储介质。可以写一个allocator,直接向硬盘取空间。 不过,实际上,我们最常用的就是用于配置内存。 空间配置器的标准接口 allocator标准接口: allocator 阅读全文
摘要:
C++ 11知识点:std::is_convertible 简介 is_convertible用于判断是否可以转换:第一个模板参数的类型是否可以转换为第一个模板参数的类型。 如果To, From都是基本类型,那么可以隐式转换。 如果To是基类,From是子类,那么From可以转换为To。 class 阅读全文
摘要:
C++ 11知识点:std::is_trivially_destructible 简介 判断一个类型T是否是一个平凡的可销毁类型(trivivally destructible)。主要用于检查这个类型的析构函数。 一个trivivally destructible类(由class,struct/un 阅读全文
摘要:
最大文件描述符数量 文件描述符是服务器程序的宝贵资源,几乎所有系统调用都是和文件描述符打交道。而系统分配给进程的文件描述符数量有限,因此需要及时关闭那些不用的文件描述符。 Linux对应用程序能打开的最大文件描述符数量,有2个层次限制:用户级限制,系统级限制。 1)用户级限制,是指目标用户运行的所有 阅读全文
摘要:
UID、EUID、GID、EGID 几个常见用户信息概念:UID、EUID、GID、EGID UID:当前进程的真实用户ID; EUID:有效用户ID; 真实组ID:GID; 有效组ID:EGID; 可以通过下面这组函数获取和设置当前进程的用户信息: #include <sys/types.h> # 阅读全文
摘要:
tee() 在两个管道文件描述符之间复制数据,也是重要的零拷贝技术之一。tee不消耗数据,因此源文件描述符上的数据仍然可以用于后续的读操作。 tee签名 #define _GNU_SOURCE /* See feature_test_macros(7) */ #include <fcntl.h> s 阅读全文
摘要:
splice用于在两个文件描述符之间移动数据,也是一种重要零拷贝技术。 splice声明 #define _GNU_SOURCE /* See feature_test_macros(7) */ #include <fcntl.h> ssize_t splice(int fd_in, loff_t 阅读全文
摘要:
存储映射的基本概念 存储映射(memory map)简称mmap,是直接将实际存储的物理地址映射到进程空间,而不使用read/write函数。这样,可以省去中间繁杂调用过程, 快速对文件进行大量输入输出。 mmap() 用于申请一段内存空间,将一个文件或Posix共享内存区对象映射到进程的地址空间; 阅读全文