zoukankan      html  css  js  c++  java
  • C++学习笔记STL(Standard Template Library)标准模板库-顺序容器-动态的连续数组(vector)

    std::vector

    vector的存储时自动管理的,按需扩张。vector通常占用多于静态数组的空间,因为要分配更多内存以管理将来的增长。vector所用的方式不在每次插入元素时,而只在额外内存耗尽时重分配,分配的内存总量可用capacity()函数查询。额外内存可通过对shrink_to_fit()的调用返回给系统。重分配通常时性能上有开销的操作。若元素数量已知。则reserve()函数可以用于消除重分配。

    vector 上的常见操作复杂度(效率)如下:

    • 随机访问——常数 O(1)
    • 在末尾插入或移除元素——均摊常数 O(1)
    • 插入或移除元素——与到 vector 结尾的距离成线性 O(n)

    一.元素访问

    1.at访问指定的元素,同时进行越界检查,若不在容器范围内,则抛出std::out_of_range类型的异常

    2.operator[]访问指定的元素,此运算符决不插入新元素到容器。通过此运算符访问不存在的元素是未定义行为。

    3.front 访问第一个元素,c.front()等价于*c.begin();

    4.back访问最后一个元素,c.back()等价于*sed::prev(c.end());

    5.返回指向内存中数组第一个元素的指针.指针满足范围 [data(); data() + size()) 始终是合法范围,即使容器为空(该情况下 data() 不可解引用)。

    二.迭代器

    1,begin/cbegin 返回指向起始的迭代器,若为空,则返回迭代器end().

    2.end/cend返回指向未尾的迭代器,此元素未占位符;试图访问它导致未定义行为

    3.rbegin/crbegin 返回指向起始的逆向迭代器,对应非逆向未元素,若为空,则返回迭代器等于rend()

    4.rend/crend返回指向未尾的逆向迭代器,对应非逆向元素的前一元素,此元素为占位符。试图访问它导致未定义行为

    三.容量

    1.empty  检查容器是否为空,begin()==end().

    2.size    返回容器的元素数, std::distance(begin(),end())

    3.max_size  返回可以容纳 的最大元素,理论上的极限

    4.reserve  预留存储空间,reserve(tp)增加容量大于或等于tp的值。若tp大于当前的capacity(),则分配新存储。否则该方法不做任何事;

    注意:改方法不改变vector的size.

    正确使用 reserve() 能避免不必要的分配,但不适当地使用 reserve() (例如在每次 push_back()调用前调用它)可能会实际增加重分配的数量(通过导致容量线性而非指数增长)并导致计算复杂度增加,性能下降。例如,按引用接受任意 vector 并后附元素的函数通常应在 vector 上调用 reserve() ,因为它不知道该 vector 的使用特征。

    5.capacity  返回当前存储空间能够容纳的元素数;

    6.shrink_to_fit  通过释放未使用的内存减少内存的使用;它是减少capacity()到size()非强制性请求。

    四.修改器

    1.clear    清除元素,调用后size()返回0.

    2.insert    插入元素,可以插入元素到指定位置。

    3.emplace  原位构造元素;

    4.erase    擦除元素,

    5.push_back  将元素添加到容器未尾

    6.emplace_back  在容器未尾就地构造元素

    7.pop_back    移除未元素

    8.resize  改变容器中可存储元素的个数

    9.swap   交换内容

    10,erase/erase_if 从容器中擦除所有比较低于value的元素,等价于:

    1 auto it = std::remove(c.begin(), c.end(), value);
    2 auto r = std::distance(it, c.end());
    3 c.erase(it, c.end());
    4 return r;
  • 相关阅读:
    join函数——Gevent源码分析
    代理上网(ssh 动态端口转发)
    内核热patch
    技术债
    mysql 隔离级别与间隙锁等
    python type
    django : related_name and related_query_name
    ssh 卡主
    logistics regression
    __new__ 和 __init__
  • 原文地址:https://www.cnblogs.com/qq964107326/p/15054787.html
Copyright © 2011-2022 走看看