容器总结——容器的共同能力和使用时机


  1. 容器共同能力和操作

    1. 所有容器提供的都是value语义,对元素的安插实施的都是copymove。每个元素都需要能够copymove。要么元素就是指针或指向对象的pointer object

    2. 元素在容器内有其特定的顺序。Unordered也是(不调用增加或删除元素的操作)

    3. 初始化P255对于array的特例

      一般使用初始化语法,也就是大括号,否则用小括号将实参括起来

      move可显著提升效率

      .begin() .end() .cbegin() .cend()都是返回iterator。对C-stylearray std::begin()

    4. 赋值

      元容器所有元素复制到目标容器,后者原来的元素全部移除。可以用move语义,只是将内部pointer交换而已,并不复制value,具有常量精度,copy线性精度。

      原来存在的迭代器和reference都仍指向原先所指元素,只不过那些元素已位于另一个容器中。(array除外)

    5. 大小相关操作函数

      Empty()   size()   max_size()

    6. 比较

      Unordered只有==!=。其他的还有4

      比较两端(容器)必须属于同一类型

      两个容器依序相等则相等

      字典式判断大小

    7. 元素访问

      所有容器都提供迭代器接口,支持range-based for

      最容易访问元素的办法:

      For (const auto & elem : coll){

            Std::cout<<elem<<std::endl;

      }

      要修改元素去掉const

      在指定位置执行某种操作(安插、删除、搬移)可有cbegin()cend()产生的迭代器只读操作,begin()end()产生的迭代器进行改写操作。

    8. 容器提供类型

      P260


  2. 其他STL容器和各容器的使用时机


    可以使用string和寻常array作为STL,自己提供容器“STL的方法:


    1. 直接提供STL容器所需的接口

    2. 提供特殊迭代器

    3. 将上述两种方法结合


      1. String作为STL容器

        标准的stringclass提供了STL容器接口。对string的总结放在后面。

      2. C-stylearray作为STL容器

        容器array就是包覆了一个寻常的 static C-style array。比寻常array安全,而且效率没有变差。

      3. 实现reference语义

        STL提供的都是value语义,以copymove进行的。要使用reference语义就要采用智能指针(更安全,便捷)。也可以使用外覆器byvalue转换为byreference

        用智能指针即将指针存入容器中,排序时按指针大小排序。

      4. 各种容器的使用时机


    1. 默认情况下使用vector,结构简单,随机访问,方便快捷。

    2. 若经常在头尾安插移除元素用deque,若希望元素移除时容器缩减也用deque

    3. 经常在容器中间安插移除和移动用list,但是list不支持随机访问,注意取舍。

    4. 需要容器对异常处理使得操作不成功便无任何作用,用listassociative/unordered容器。

    5. 经常依据某个准则查找元素unorderedset/multiset,如果还须依赖元素的次序则用set/multiset

    6. 如果是处理key/valuepair,用unorderedmap/multimap,如果还须依赖元素的次序则用map/multimap

    7. 如果需要关联数组,用map,如果还须依赖元素的次序则用map

    8. 如果需要字典结构用unorderedmultimap,如果还须依赖元素的次序则用multimap


    另外,如果需要两个排序准则,则需要使用reference语义来存储,各自拥有不同排序准则但是有共同的元素。


    关联式容器每安插一个新元素就会重新排一次序,若经常安插效率不如用序列式容器:先安插所有元素,用排序算法进行一次完全排序。



  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值