• 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;
  • 相关阅读:
    从滴滴flinkCEP说起
    从零讲Java,给你一条清晰地学习道路!该学什么就学什么!
    从coalesce算子发散开的
    从架构理解价值-我的软件世界观
    为什么说Redis是单线程的?
    全排列_获取第几个排列_获取是第几个排列__康托展开,逆康托展开
    求排列是全排列的第几个,求第几个是全排列___康托展开,逆康托展开
    搜索入门_简单搜索bfs dfs大杂烩
    无根树同构_hash
    乘法逆元_三种方法
  • 原文地址:https://www.cnblogs.com/qq964107326/p/15054787.html
Copyright © 2020-2023  润新知