【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 );
向容器末尾插入元素。