c++ STL与内核分析 其一 各个容器的介绍
文章目录
前言
本文是对侯捷老师的stl程序的学习笔记以及自己的一些体会。
一、STL的组成部分
1.容器(Container)
存放数据的地方
2.分配器(ALLocators)
3.算法(ALgorithms)
对容器中的存放的数据进行的一些操作
4.迭代器(Iterators)
是一组指针或者仿函数,对容器和算法的操作
5.适配器(Adapters)
仿函数或者是类,可以对迭代器,容器,进行改造,从而获得一些功能
6.仿函式(Functors)
二.容器
1.结构与分类
容器遵循前闭后开的准则,即begin指针指向第一个元素,end指针指向最后一个元素的下一个空间。
分类:
顺序性容器(Sequence containers)
特点:查找和排序不方便。
*array(数组)
使用时需指定大小。
测试:
*vector
前闭后开结构,当存放元素超过容器大小时,会两倍扩充容器大小并把原来的数据复制过去
*Deque
双向开放,内部实际上分段连续,内部有许多个分段的buffer用于存放元素,并有一个vector容器用于存放指向各个buffer的指针。当使用空间不足时,在内粗中寻找两倍与之前的空间并把原来的数据存放与新的容器中间。
*list(链表)
迭代器逐步移动,遍历操作比较耗时。
关联性容器 (Associated containers)
特点:容器内元素排序后存放在容器内,查找方便,由于元素存放时便已经排好序,故一般不提供sort方法。
*set/mutiset(集合):
*Map/multimap:
哈希表(hashtable)
各个容器的测试代码:
#include<iostream>
#include<cstdlib>
#include<ctime>
#include<array>
#include<deque>
#include<vector>
#include<forward_list>
#include<stack>
#include<map>
#include<set>
#include <algorithm>//使用find函数时或者stl自带算法需要附加头文件
using namespace std;
const long asize = 50000L;
//容器array(数组)的测试程序
//容器vector的测试程序
namespace jj01
{
string get_a_target_string()
{
//函数作用,从键盘输入一个0~32768之间的数,并把它转化为string,创建一个对象
long target=0;
char buf[10];
cout << "target (0~" << RAND_MAX << "): ";
cin >> target;
snprintf(buf, 10, "%d", target);
return string(buf);
}
void test_array(){
cout<<"testing array ...."<<endl;
array<long, asize > a;//long是数据类型,asize是容器大小
clock_t start =clock();
for(long i = 0; i<asize ;++i)
{
a[i]=rand();
}
cout<<"milli-seconds: "<<(clock()-start)<<endl;
cout<<"array.size "<<a.size()<<endl;
cout<<"array.front "<<a.