C++ STL源码剖析——P1、P2、P3、P4、P5、P6、P7

P1 认识headers、版本、重要资源

C++标准库中有百分之八十左右都是由 STL组成的

一、C++Standard Library 标准库 vs Standard Template Library (STL)标准模板库

  1. C++标准库和STL的关系:
    C++标准库>STL,STL包含的是六大部件,C++标准库还包含其他一些东西
    C++标准库中有百分之八十左右都是由 STL组成的

  2. 标准库以head files形式存在
    (1)C++标准库的head files不带文件延申名(.h),例如#include<vector>
    (2))新式 C head files 不带副档名 .h,例如 #include <cstdio>
    (3)旧式C head files (带有副档名.h)仍然可用,例如#include

二、常用网站:

cplusplus.com
cppreference.com
gcc.gnu.org

P2 STL 体系结构基础介绍

  • 程序 = 数据结构 + 算法

一、STL 六大部件(components)

部件名称 英文名 作用
容器 Containers 容器就是用来储存元素的,元素就需要占用内存,是用来解决内存的事情
分配器 Allocators 分配器是用来支持容器的,解决内存的事情
算法 Algorithms 具有某种功能的函数,算法可以独立出来,通过迭代器作用到多种容器
迭代器 Iterators 属于泛型指针,作为 算法和容器沟通的桥梁
适配器 Adapters 使 XX 看起来像是 XX, XX 可以是另外五种部件,都可以适当的转换
仿函数 Functors 其实,它的作用就相当于是一个函数
  1. 六大部件之间的关系:
  • 容器用来存储元素,实现是一种class
  • 分配器用来给容器分配内存大小
  • 迭代器用来实现容器中元素的访问,是算法和容器之间的桥梁
  • 算法可以独立出来,通过迭代器作用到多种容器
  • 适配器用做对象的包装,使之适应不同的接口实现
  • 仿函式是一种用来实现函数功能的class

在下图中,我们使用了:
1.一个容器vector
2.使用vector时,使用分配器allocator分配内存:vi是个数组(里面放着从ia头到ia尾的元素)
3.使用vi.begin(),vi.end()即迭代器,作为算法的参数,也就是让count_if去处理这些元素
4.使用count_if算法
5.使用仿函数less():小于40的元素有哪些?
6.使用函数适配器来对我们算法的结果进行进一步筛选(not1, bind2nd),not1变成找大于等于40的元素

C++ STL源码剖析——P1、P2、P3、P4、P5、P6、P7_第1张图片

二、容器区间

基本所有容器都有begin()和end()指针
C++ STL源码剖析——P1、P2、P3、P4、P5、P6、P7_第2张图片

  1. 如何定义一个iterator?
Contaniner<T>:: iterator ite=c.begin();
  1. 遍历容器:for/while
for(;ite!=c.end();++ite)

或者

while(ite!=c.end())
{
	++ite;
}
  1. 从C++11开始的新写法
    C++ STL源码剖析——P1、P2、P3、P4、P5、P6、P7_第3张图片
  2. auto:类型自动推导
    如下:ite的类型其实是list<string> :: iterator。但是我们用auto来代替。
    C++ STL源码剖析——P1、P2、P3、P4、P5、P6、P7_第4张图片

P3 容器分类与各种测试(一)—— P6 容器分类与各种测试(四)

一、序列式容器

序列式容器的特点是将数据放进容器之后,会按照用户放进去的顺序依次排列

序列式容器 特点
array 一段连续空间,当初定了多大那就是多大空间,前面与后面是无法扩充的,不论是否使用,都会全部占用
vector 尾部可进可出,当空间不够时会自动扩充
deque 双向都可扩充,两端都可进可出
list 一个双向环状链表,有向前和向后两个指针
forward_list 一个单向链表,仅有向后一个指针,占用的内存比list

C++ STL源码剖析——P1、P2、P3、P4、P5、P6、P7_第5张图片

二、关联式容器

关联式容器类似于key-value,非常适合于查找操作

关联式容器名 特点 实现 注释
set/multiset key和value是同一个,存储是有序的 红黑树 加上multi意味着可以加入重复键值对
map/multimap 每一个key对应一个value,存储是有序的 红黑树 加上multi意味着可以加入重复键值对
unordered_set/unordered_multiset 相对于set/multiset,存储是无序的 哈希表 加上multi意味着可以加入重复键值对
unordered_map/unordered_multimap 相对于map/multimap,存储是无序的 哈希表 加上multi意味着可以加入重复键值对

C++ STL源码剖析——P1、P2、P3、P4、P5、P6、P7_第6张图片

P7分配器之测试


allopcator主要成员函数:

  1. allocate: 尝试分配n个size_type类型的存储空间,然后返回第一个元素的起始地址(只是分配空间,不构造对象)
    函数原型:

pointer allocate(size_type n);

  1. deallocate: 释放先前allocate分配的且没有被释放的存储空间
    原型函数:

void deallocate(pointer p, size_t n);

p:指向以前使用allocator :: allocate分配的存储块的指针。 n:在调用allocator :: allocate时为这个存储块分配的元素数量。

你可能感兴趣的:(STL源码剖析之自立自强,c++,开发语言,数据结构)