C++STL(一)

本部分包括课程信息、一些基本概念以及容器的简单介绍和测试。

  1. 泛型编程:泛型编程使用template为主要工具,STL就是泛型编程应用的一个绝好示范。

  2. C++ Standard Library和C++ Standard Template Library的区别:标准库包括STL,可以认为STL主要包含六大部件,除此之外还有一些东西,和STL组合在一起就构成了标准库。

下面介绍STL体系结构基础:
一、六大部件(Components)

  1. 六大部件及其关系
    在这里插入图片描述

容器(Container),分配器(Allocator),算法(Algorithm),迭代器(Iterator),适配器(Adapter),仿函数(Functor)

六个部件之间的关系如上图,容器和算法的分离关系说明了STL与OO设计思想的差别,OO提倡数据和处理数据的函数放在一个class里,而STL的数据在容器里,处理数据的函数在算法里。Adapter可以理解为“变压器”。

  1. 一个使用六个部件的例子
    #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;
    }

二、容器的结构、分类及各种测试

  1. 容器的结构与分类
    在这里插入图片描述

大致分为两类:序列型容器和关联型容器。标红的是C++11新增的容器

  1. 测试各种序列式容器

(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. 测试各种关联式容器

关联式容器可以理解为一种小型的关系型数据库,所以查找起来非常快

(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
在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值