美文网首页
Chapter 9 Sequence Container

Chapter 9 Sequence Container

作者: 再凌 | 来源:发表于2020-03-17 10:15 被阅读0次
    容器 内容 说明
    vector / string 除了在尾部, 其他的增删都很慢, 可随机访问 增减元素可能会导致元素位置发生移动
    deque 除了在两头, 其他增减都很慢 在头部插入元素不会影响end迭代器
    list 双向链表,只能顺序访问, 但是增删很快 -
    forward_list 单向链表 不存储size()
    array 固定大小,不能增减元素 -

    迭代器线程安全, 各种容器的操作看这里

    begin & end 迭代器

    两个迭代器都不能比较大小, 只能通过begin != end来判断是否到达末尾

    使用array容器代替C语言风格的数组

    array<int, 10>
    

    好处: 可以让两个同类型的数组相互赋值

    swap(a,b)

    作用: 交换两个容器的内容. 不会使指针, 引用失效(除了string和array,对于array, 位置没变, 但是里面的元素值变了)

    swap比赋值快的多, 是常数时间.(array除外, 随着size上升线性增长)

    assign()方法

    重初始化, 和初始化时的传递参数类似, 允许从类型相容的参数来赋值这个容器.

    array没有这个方法

    容器 - 增加操作

    push_back()
    push_front()

    insert(p, ....) 迭代器/ 集合/ 个数*值/ 值
    注意插入在p元素之前, 返回值是新插入的第一个元素位置迭代器

    emplace(args)
    不创建临时对象, 直接构造, 因此比insert更好
    args是这个对象的构造方法, 因此emplace是放入了一个刚构造好的对象

    给容器增加元素, 增加的是这个元素的拷贝

    使用.at(p)代替[]

    如果位置p超出了size范围, 则函数会返回一个out_of_range的error

    pop_back()和pop_front() 不负责保存返回值, 调用之前手动存起来

    .resize()

    增大减少容器大小, 增大时可以指定新初始化

    forward_list

    单向链表没有指向前一个的指针, 所以插入操作只能放在当前元素的后面, 因此所有的操作都和其他容器不一样.

    原来的操作 forward_list操作
    insert() insert_after()
    emplace() emplace_after()
    erase() erase_after()
    begin() before_begin()返回首前迭代器

    string的查找操作

    .find()支持很多方式的查找, 如果查找失败, 会返回unsigned类型的-1, 于是显示出来就是UNSIGNED_MAX, 因此这个位置比string里的哪个位置都要大.

    适配器

    C++提供了三种适配器: stack, queue 和 priority_queue

    priority_queue可以为元素设定优先级, 新加入的元素放在所有优先级比他低的元素的前面

    创建方法是:

    stack<int, deque<int>> xxx
    

    创建一个xxx的空stack, 基于deque实现

    类型 要求
    stack 使用除了array和forward_list之外的容器都可以作为底层
    queue 要求实现push_back(), back(), push_front(), 因此可以基于list和deque实现
    priority_queue 能够随机访问, 实现push_back, pop_back(), front(), 因此可以基于的deque或者vector实现

    适配器不可以使用底层实现容器的操作, 只能使用自己的操作

    相关文章

      网友评论

          本文标题:Chapter 9 Sequence Container

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