美文网首页
第六周 C++标准库 体系结构与内核分析 Boolan 侯捷

第六周 C++标准库 体系结构与内核分析 Boolan 侯捷

作者: 一般的路人丙 | 来源:发表于2017-03-02 20:13 被阅读0次

    ** 使用一个东西,却不明白它的道理,不高明!**

    1. 认识headers、版本、重要资源

    所谓 Generic Programming,就是使用 template(模板)为主要工具来编写程序。

    应具备的基础

    • C++ 基本语法
      (包括如何正确使用模板,templates)

    我们的目标

    • level 0:使用 C++标准库
    • level 1:认识 C++标准库(胸中自有丘壑)
      知道在内存中是什么样的
    • level 2:良好使用 C++标准库
    • level 3:扩充 C++标准库

    C++ Standard Library vs. Standard Template Library

    • C++ Standard Library
      C++ 标准库
    • Standard Template Library
      STL,标准模板库
      STL 有六大部件

    标准库包括标准模板库。
    标准库以 header files 形式呈现

    标准库命名

    C++标准库,版本

    C++标准库版本取决于使用的编译器

    重要网页

    CPlusPlus.com(打开慢)
    CppReference.com(√)
    gcc.gnu.org(打开慢)
    用来查看标准库的参考文献,非常有用。

    Bibliography(参考书目)

    The C++ Standard Library Second Edition
    STL 源码剖析(精巧)

    你将获得的代码

    Test-STL.cpp
    内有对 STL 的各种测试

    2. STL 体系结构基础介绍

    我们第一个 C++ STL Application

    STL 六大部件(Components):

    • 容器(Containers)
    • 分配器(Allocators)
    • 算法(Algorithms)
    • 迭代器(Iterators)
    • 适配器(Adapters)
    • 仿函式(Functors)
    六大部件关系

    STL 六大部件关系

    六大部件关系

    复杂度,Complexity,Big-oh

    目前常见的Big-oh有下列几种情形:
    (n 是一个很大的数,十几万几十万以上)

    1. O(1)或 O(c):称为常数时间(constant time)
    2. ……
    常见的Big-oh

    “前闭后开”区间

    “前闭后开”区间
    [ )
    *(c.begin())*(c.end())
    两个指针,一个指向第一个,一个指向末端的后一个(空的)
    遍历的方法
    所有的容器都有下面的一种 iterator,实际上是一个指针

    rage-based for statement(since C++11)

    rage-based for statement
    for (decl : coll){
      statement
    }
    

    auto keyword(since C++11)

    auto keyword

    适度使用
    首先要知道类型,auto 只是缩写
    通过赋值右侧来推断左侧类型

    3. 容器之分类与各种测试

    容器-结构与分类

    容器-结构与分类
    • Sequence Containers (循序式容器)
      • Array(C++11,数组包装而成,不能扩充)
      • Vector(起点不能动,后面可以扩充)
      • Deque(两端可进可出,首尾均可扩充)
      • List(双向环状链表)
      • Forward-List (C++11,单向链表)
    • Associative Containers
      • Set/Multiset(并没有规定是什么树,但是各家编译器内部都是用红黑树,会自动分配分支,不至于一边特别长)
        Set 就是 Value,前后区别就是key能不能重复。
      • Map/Multimap
        比如学号不能重复,所以用 Map。如果放的东西是可能重复的,就不能用 Map,要用 Multimap。
    • Unordered Containers (C++11,其实是一种关联式容器)

    HashTable 最好的一种实现,是 Separate Chaining

    以下测试程序之 辅助函数

    辅助函数

    放字符串,以模拟放的对象。

    使用容器 array

    array

    为每一段写一个 namespace
    在每一段前写头文件的引用,重复无妨
    变量在用的时候再去生命
    把声明提前,可以便于查找

    使用容器 vector

    vector vector

    push_back用于在尾部放数据
    大部分容器都有 push_back
    Vector使用空间的增长是两倍增长,放第3个时会使用4个,放第5个时使用8个……
    发现错误,一定要 abort()
    全局函数即使没有写::也可以找到。

    使用容器 list

    list

    容器有自己的 sort,就用自己的

    使用容器 forward_list

    forward_list

    push_front没有push_back

    使用容器 slist

    slist

    single list,单向串联,非标准的

    使用容器 deque

    deque deque

    分段连续,做成连续的假象
    一段叫做 buffer,一个 buffer 是512
    可以向前扩充,
    max_size 是最大的
    deque 没有 sort
    关联容器查找,非常快,基本都是0毫秒
    deque 包含了 queue 和 stack 的功能
    所以 queue 和 stack 里面都是有一个 deque,有人把 queue 和 stack 叫做 deque 的 adapter

    使用容器 stack

    stack

    push pop
    先进后出,不提供 iterator

    使用容器 queue

    queue

    先进先出
    push pop,不提供 iterator

    使用容器 multiset

    multiset

    自己带有 find。
    放进去的重复的也可以放入,如果是 set,放进去的就会少

    使用容器 multimap

    multimap

    一个是 key,一个是 value
    用 key 来找 value
    用 pair 组合在一起

    使用容器 unordered_multiset

    unordered_multiset unordered_multiset

    使用 hash-table
    separate chain
    篮子比元素多,因为有的篮子是空的
    每个篮子里元素不能太多,因为是循序查找
    如果元素的个数大于等于篮子个数,篮子就需要扩充,变成大约两倍。所以篮子一定比元素多。

    使用容器 unordered_multimap

    unordered_multimap

    关联式容器,红黑树或 hash 表

    使用容器 set

    set

    key 必须是独一无二的

    使用容器 map

    map

    使用容器 unordered_set

    unordered_set unordered_set

    使用容器 unordered_map

    unordered_map

    还有其他容器,如priority queue、heap
    用的人少,是借用其他容器做支撑

    分配器测试

    使用分配器 allocator

    allocator allocator allocator

    相关文章

      网友评论

          本文标题:第六周 C++标准库 体系结构与内核分析 Boolan 侯捷

          本文链接:https://www.haomeiwen.com/subject/cdtfgttx.html