STL概述
C++标准库中包含STL(即STL+一些小东西),STL提供了一组通用的算法和数据结构。它包括向量、链表、映射等容器,以及用于排序、搜索和操作这些容器的算法。
header
- C++标准库的 header files 不带
.h
,例如:#include<vector>
- 新式 C header files 不带
.h
,例如:#include<cstdio>
- 老式 C header files 带
.h
仍然可用,例如:#include<stdio.h>
STL 六大部件
C++标准模板库Standard Template
最重要的六大部件(Components
):容器、算法、仿函数、迭代器、适配器、分配器
- 容器:容器提供了不同的数据结构,用于存储和管理数据。
- 分配器:分配器用于管理内存的分配和释放。
- 算法::STL提供了一系列的算法,如排序、查找、复制、删除等。
- 迭代器:迭代器是STL中用于遍历容器元素的对象。
- 仿函数:STL中的仿函数是一种可调用对象,类似于函数指针。它们可以被用作算法的参数,用于定义算法的操作。
- 适配器:适配器是一种用于改变容器接口的对象。
使用例子:
#include <iostream>
#include <vector>
#include <functional>
using namespace std;//打开std这个命名空间
int main()
{
int ia[6] = { 27, 210, 12, 47, 109, 83 };
//vector 为容器 ,allocator为分配器,可以不写
vector<int, allocator<int>> vi(ia, ia + 6);
//connt_if 为算法, vi.begin() 和 vi.end()为迭代器
cout << count_if(vi.begin(), vi.end(),
not1(bind2nd(less<int>(),40)));
//not1 和 bind2nd 为仿函数适配器,less为仿函数
return 0;
}
容器(Containers)
- 序列容器 array、vector、deque、forward-list
- 关联容器 set、multiset、map、multimap
Unordered容器也属于关联容器,由hash-table实现
分配器(allocators)
- 容器需要一个东西来支持它对内存的使用,这个东西就是分配器,最好的情况下,我们不需要知道这个东西,所以需要一个默认的分配器。如果不指定分配器,就会使用默认分配器。
C++层面用operator new() ,C 层面用malloc()
- allocator只是以::opreator new 和 ::opreator delete 完成 allocate() 和 deallocate(),没有任何特殊设计;
- allocate()会调用malloc()
- deallocate()调用free()
我们需要的size
是青色部分空间的大小,但是malloc
会在青色部分外包裹其他东西。因此,会产生一些额外开销(如果要分配的区块小,那么额外开销就相对较大,不能忍受)
16条链表,负责不同大小的内存分配。8字节对齐(1-128)。每个内存块不会都带cookie
。只会在链表的头尾有cookie
。-------- templete <class T, class Alloc = alloc>
有以下分配器(不在标准库)
array_allocator
__mt_allocator //多线程
debug_allocator
__pool_allocator//内存池
bitmap_allocator
malloc_allocator
new_allocator