容器总结——array、vector、deque


  1. Array  #include <array>

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

Array 并不支持分配器。Array适用任何STL算法

 

特性:

有序集合、随机访问、内存分配在stack中,绝不会重新分配

    1. 初始化

Default构造函数并非建立空容器。不赋初值不明确,不是0

array声明期间初始化是使用初值列的唯一途径。(不能超出大小)不能用小括号

    1. Swap()

可以和一个类型相同的array(元素类型和大小都相同)置换。

不仅只置换内部pointer有线性复杂度。

Iteratorreference不会随着元素的置换而改变所指容器,但指向不同元素

    1. 大小

可能是0 。但是front()back()返回值不明确。

    1. 建立/复制/销毁

Array<elem,N>c / c(c2) / c=c2 / c(rv) / c=rv / c=inilist

    1. 非更易操作

      .empty() .size() .max_size() c1==c2(返回boolc1!=c2c1<c2 c1>c2 c1<=c2 c1>=c2

    2. 赋值

      C=c2                c=rv           c.fill(val)            c1.swap(c2)            swap(c1,c2)

      Swap()不保证常量复杂度,因为不可能在内部交换pointer

    3. 元素访问

      Range-based for、操作函数、迭代器。可以用get<>()访问。

      [ ].at()(更安全)(返回reference)。c.front() c.back() 返回第一、最末元素。

      (对于空array,会不明确)

    4. 迭代器相关函数

Array提供随机访问迭代器、反向迭代器,可以对array用任何STL算法

    1. Tuple接口

      Array提供了tuple接口。可以用:

      tuple_size<>::value取得元素个数

      tuple_element<>::type取得元素类型

      Get<1>(a)取得元素

    2. C-style array处理

      C++ 不需要C-style arrayvectorarray提供了C-style array所有特性,更安全更方便的接口。

  1. Vector   #include<vector>

将元素至于dynamic array中进行管理。

 

特性:

有序集合、随机访问、试用任何STL算法

末端附加删除效率高,中间则每次调用assignment操作符移动元素

    1. Vector容量和大小

      优异效率:分配出较其容纳元素更多的内存。

      附加大小函数capacity(),返回实际能够容纳的元素亮,超过将重新分配内存:

  1. 一旦重新分配内存,所有referencepointeriterator都会失效

  2. 内存重新分配很耗时间

保留容量方法:

  1. V.reserve(80)  更好

  2. Std::vector<int >v(5)   耗时不如使用.reserve()

    1. 初始化(额外的)

      Vector<elem> c(n,elem)/c(n)(初始化为0

    2. 非更易操作

      .capacity()  .reserve(num)

    3. 赋值

      c.assign(n,elm)  c.assign(beg,end)  c.assign(inilist) 

    4. 元素访问

      Range-based for、操作函数、迭代器。

      [ ].at()(更安全)(返回reference)。c.front()      c.back() 返回第一、最末元素。

      (对于空array,会不明确)调用[ ]时必须确保索引有效。

    5. 迭代器相关函数

Array提供随机访问迭代器、反向迭代器,可以对array用任何STL算法

Vector迭代器持续有效,除非:1.在较小索引位置安插删除元素2.内存重新分配

    1. 安插移除元素

      保证:1.迭代器必须指向一个合法位置2.区间的其实位置不能在位置结束之后

      以下安插、移除比较快:

1.在尾部2.容量足够大3.安插多个元素时调用一次

提供反向迭代器P276

 安插和移除元素,作用点之后的referencepointeriterator都会失效。

安插和移除的成员函数:P277(可与算法结合删除某值元素).erase()的危险

    1. C-style array处理

      不要将迭代器当做第一元素的地址来传递

    2. Class vector<bool>

      bool型元素的特化版本,消耗空间远小于一般vector

  1. Deque   #include<deque>

将元素至于dynamic array中进行管理。

 

特性:

有序集合、随机访问、试用任何STL算法

    1. Dequevector相比:

  1. 两端都能快速安插和删除元素

  2. 访问元素时多一个间接过程

  3. 迭代器需要在不同区块跳转,必须是smart pointer

  4. 内含更多元素

  5. 除了两端安插删除元素,其他都会使referencepointeriterator失效。

  6. 内存重分配由于vector,不必复制所有元素

  7. 会释放不再使用的内存区块

 

采用deque1.两端安插移除2.无需指向容器内元素3.不再使用的元素必须释放

 

    1. Deque各项操作只有两点与vector不同:

  1. Deque不提供容量操作(capacity()reserve()

  2. 增加头部元素操作:push_front()pop_front()

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值