本部分包括课程信息、一些基本概念以及容器的简单介绍和测试。
-
泛型编程:泛型编程使用template为主要工具,STL就是泛型编程应用的一个绝好示范。
-
C++ Standard Library和C++ Standard Template Library的区别:标准库包括STL,可以认为STL主要包含六大部件,除此之外还有一些东西,和STL组合在一起就构成了标准库。
下面介绍STL体系结构基础:
一、六大部件(Components)
- 六大部件及其关系

容器(Container),分配器(Allocator),算法(Algorithm),迭代器(Iterator),适配器(Adapter),仿函数(Functor)
六个部件之间的关系如上图,容器和算法的分离关系说明了STL与OO设计思想的差别,OO提倡数据和处理数据的函数放在一个class里,而STL的数据在容器里,处理数据的函数在算法里。Adapter可以理解为“变压器”。
- 一个使用六个部件的例子
#include <vector>
#include <algorithm>
#include <functional>
#include <iostream>
using namespace std;
int main()
{
int ia[6] = {1, 2, 3, 4, 5, 6};
vector<int, allocator<int>> vi(ia, ia + 6);
cout << count_if(vi.begin(), vi.end(),
not1(bind2nd(less<int>(), 3)));
//not1是一个function adapter(negator)
//bind2nd是一个function adapter(binder)
//less<int>()是一个function object(是个临时对象)
return 0;
}
二、容器的结构、分类及各种测试
- 容器的结构与分类

大致分为两类:序列型容器和关联型容器。标红的是C++11新增的容器
- 测试各种序列式容器
(1) array

(2) vector

push_back()了一百万个元素,用了大概3000ms,和array比起来,慢了好多。(可能因为vector的扩容)
(估计不是因为扩容,而是因为每次需要开辟空间,因为array的空间是静态分配的。因为后面显示list插入一百万个元素耗时和vector差不多)
使用::find()几乎不费时,使用先排序再二分用时还挺长的。(可能是运气好,毕竟只找了一次,不能得出很严谨的结论)
(3) list

list有一个max_size()的成员函数,返回的值很大,好几亿。list自己有一个sort()的成员函数
(4)forward_list

测试结果和list的相似。但是单链表没有back()和size()的成员函数
(5)deque

deque的两端扩容是怎么实现的?按理说的话,vector的扩容是在另一个地方开辟足够的空间,然后再把老地方里面的元素copy过去,因为原地扩容的话可能地方不够用,但是deque竟然可以两端扩容,那么它是怎么实现的呢?deque的底层结构示意图如下:
deque其实是由一段一段的buffer组成的,每段buffer有一个固定的长度,deque维护的只是指向每个buffer的指针,当deque需要扩容时,就在前面或者后面新增一个buffer。也就是deque其实是分段连续的,但是deque却表现为整段连续,这当然是通过重载迭代器的相关操作符实现的。
下面是deque的测试情况,和之前容器表现都类似:

容器适配器stack和queue内部就是有一个deque,从而能实现栈和普通队列的行为。
- 测试各种关联式容器
关联式容器可以理解为一种小型的关系型数据库,所以查找起来非常快
(1) multiset

注意容器本身的find()和全局的find()的速度对比
(2) multimap

注意multimap不能用[ ]做插入。
(3) unordered_multiset
有一个bucket_count()的成员函数,能看到桶的数量。有一个bucket_size(i)的成员函数,能看到第i个桶的元素个数。

(4) unordered_multimap

(5) set

(6) map

(7)unordered_set

(8) unordered_map

2404

被折叠的 条评论
为什么被折叠?



