【C++】vector

1、定义

template<
    class T,
    class Allocator = std::allocator<T>
> class vector;

vector是连续存储的,而且存储是自动管理的,按需扩张。vector 通常占用多于静态数组的空间,因为要分配更多内存以管理将来的增长。

vector 所用的方式不在每次插入元素时,而只在额外内存耗尽时进行重分配。分配的内存总量可用 capacity() 函数查询。可以通过调用 shrink_to_fit()返回多余的内存给系统。

重分配通常是性能上有开销的操作。如果元素数量已知,那么 reserve() 函数可用于消除重分配。

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

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

2、特化

标准库提供 std::vector 对类型 bool 的特化,它可能为空间效率优化。

vector<bool>  节省空间的动态 bitset

3、成员函数

3.1 元素访问

3.1.1 at

reference at( size_type pos );
const_reference at( size_type pos ) const;

参数:

  • pos - 要返回的元素位置

返回值:

  • 所需元素的引用

异常:
pos >= size(),则抛出std::out_of_range.

3.1.2 operator[]

返回指定位置的元素引用,不做边界检查。

注意:不能通过该操作符向容器插入新元素,通过此运算符访问不存在的元素是未定义行为。

3.2 容量

3.2.1 empty

bool empty() const;

检查容器是否无元素,即是否 begin() == end()。

返回值:

若容器为空则为 true,否则为 false。

3.2.2 size

size_type size() const;

返回容器中的元素数,即 std::distance(begin(), end())。

3.2.3 max_size

size_type max_size() const;

返回根据系统或库实现限制的容器可保有的元素最大数量,即对于最大容器的 std::distance(begin(), end())。

返回值:
元素数量的最大值。

此值通常反映容器大小上的理论极限,至多为 std::numeric_limits<difference_type>::max()。运行时,可用 RAM 总量可能会限制容器大小到小于 max_size() 的值。

3.2.4 reserve

void reserve( size_type new_cap );

增加 vector 的容量(即 vector 在不重新分配存储的情况下能最多能持有的元素的数量)到大于或等于 new_cap 的值。如果 new_cap 大于当前的 capacity(),那么就会分配新存储,否则该方法不做任何事。

reserve() 不会更改 vector 的大小。

如果 new_cap 大于 capacity(),那么所有迭代器,包括 end() 迭代器和所有到元素的引用都会失效。否则,没有迭代器或引用会失效。

在调用 reserve() 后,插入只会在它将导致 vector 的大小大于 capacity() 的值时触发重新分配。

3.3 修改

3.3.1 push_back

void push_back( const T& value );
void push_back( T&& value );

向容器末尾插入元素。

posted @ 2024-07-12 22:37  NotReferenced  阅读(2)  评论(0编辑  收藏  举报