P1 认识headers、版本、重要资源
C++标准库中有百分之八十左右都是由 STL组成的
一、C++Standard Library 标准库 vs Standard Template Library (STL)标准模板库
-
C++标准库和STL的关系:
C++标准库>STL,STL包含的是六大部件,C++标准库还包含其他一些东西
C++标准库中有百分之八十左右都是由 STL组成的 -
标准库以head files形式存在
(1)C++标准库的head files不带文件延申名(.h),例如#include<vector>
(2))新式 C head files 不带副档名 .h,例如 #include <cstdio>
(3)旧式C head files (带有副档名.h)仍然可用,例如#include<stidio.h>
二、常用网站:
cplusplus.com
cppreference.com
gcc.gnu.org
P2 STL 体系结构基础介绍
- 程序 = 数据结构 + 算法
一、STL 六大部件(components)
部件名称 | 英文名 | 作用 |
---|---|---|
容器 | Containers | 容器就是用来储存元素的,元素就需要占用内存,是用来解决内存的事情 |
分配器 | Allocators | 分配器是用来支持容器的,解决内存的事情 |
算法 | Algorithms | 具有某种功能的函数,算法可以独立出来,通过迭代器作用到多种容器 |
迭代器 | Iterators | 属于泛型指针,作为 算法和容器沟通的桥梁 |
适配器 | Adapters | 使 XX 看起来像是 XX, XX 可以是另外五种部件,都可以适当的转换 |
仿函数 | Functors | 其实,它的作用就相当于是一个函数 |
- 六大部件之间的关系:
- 容器用来存储元素,实现是一种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的元素
二、容器区间
基本所有容器都有begin()和end()指针
- 如何定义一个iterator?
Contaniner<T>:: iterator ite=c.begin();
- 遍历容器:for/while
for(;ite!=c.end();++ite)
或者
while(ite!=c.end())
{
++ite;
}
- 从C++11开始的新写法
- auto:类型自动推导
如下:ite的类型其实是list<string> :: iterator。但是我们用auto来代替。
P3 容器分类与各种测试(一)—— P6 容器分类与各种测试(四)
一、序列式容器
序列式容器的特点是将数据放进容器之后,会按照用户放进去的顺序依次排列
序列式容器 | 特点 |
---|---|
array | 一段连续空间,当初定了多大那就是多大空间,前面与后面是无法扩充的,不论是否使用,都会全部占用 |
vector | 尾部可进可出,当空间不够时会自动扩充 |
deque | 双向都可扩充,两端都可进可出 |
list | 一个双向环状链表,有向前和向后两个指针 |
forward_list | 一个单向链表,仅有向后一个指针,占用的内存比list |
二、关联式容器
关联式容器类似于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意味着可以加入重复键值对 |
P7分配器之测试
allopcator主要成员函数:
- allocate: 尝试分配n个size_type类型的存储空间,然后返回第一个元素的起始地址(只是分配空间,不构造对象)
函数原型:
pointer allocate(size_type n);
- deallocate: 释放先前allocate分配的且没有被释放的存储空间
原型函数:
void deallocate(pointer p, size_t n);
p:指向以前使用allocator :: allocate分配的存储块的指针。 n:在调用allocator :: allocate时为这个存储块分配的元素数量。