一、vector介绍
vector是定义在命名空间std内的模板,是一种随机迭代器,其内存管理是一个一块连续分配的内存,支持动态扩展,其头文件是< vector>:
/*
T 可以是任意数据类型
Allocator:空间配置器,用于获取/释放内存以及构造/销毁该内存中的元素的分配器,默认为allocator(new/delete),一般不做修改。
*/
template <class T,class Allocator=allocator<T>>
class vector;
为了加深理解,这里把官方给出的解释也贴了出来:
vector的元素是连续存储的,这意味着不仅可以通过迭代器访问元素,还支持随机访问。这也意味着指向vector元素的指针可以传递给任何需要指向数组元素的指针的函数。
vector的存储是自动处理的,可以根据需要进行扩展和收缩。vector通常比静态数组占用更多的空间,因为分配了更多的内存来处理未来的增长,这样,vector 不需要在每次插入元素时重新分配,而是仅在额外的内存耗尽时才重新分配。可以使用vector的capacity()函数查询分配的内存总量。额外的内存也可以通过调用shrink_to_fit()返回给系统。
就性能而言,重新分配通常是代价高昂的操作。如果元件的数目是预先已知的,可以使用vector的 reserve() 函数进行预分配,以消除后续使用期间,元素个数不断增大,内存不断重新分配的问题。
vector运算的时间复杂度如下:
- 随机访问 - 常数𝓞(1)
- 末尾元素的插入或移除——摊销常量𝓞(1)
- 元素的插入或移除 - 与向量末端的距离成线性𝓞(n)
二、vector的成员函数:
1、构造函数
(1)构造一个空的vector容器,没有元素,也是默认构造函数
explicit vector(const allocator_type& alloc = allocator_type());
(2)构造一个包含n 个元素的容器,每个元素都是val的副本,若val未指定,则为默认值。
explicit vector(size_type n);
explicit vector(size_type n, const value_type& val,const allocator_type& alloc = allocator_type());
(3)构造一个包含了范围[first,last)元素的vector容器,每个元素都从该范围内的相应元素以相同的顺序就地构造。
template <class InputIterator>
vector (InputIterator first, InputIterator last,const allocator_type& alloc = allocator_type());
(4) 以vector容器x作为数据源,构造一个新list容器,其中新vector容器中的元素来自于x中元素拷贝的副本。
vector(const vector& x);
vector (const vector& x, const allocator_type& alloc);
(5)构造一个容器,并直接从x中移动元素,之后x中的元素将被移除
vector(vector&& x);
vector(vector&& x, const allocator_type& alloc);
(6)以与初始化列表相同的顺序构造一个vector容器,其中包含l中每个元素拷贝的副本
vector(initializer_list<value_type> l,const allocator_type& alloc = allocator_type());
2、operator=函数
(1)使用vector列表other对其进行复制拷贝
vector& operator=( const vector& other );
(2)使用vector列表other对其进行移动拷贝,之后other的数据将被清空
vector& operator=( vector&& other );
(3)使用初始化列表对vector进行赋值
vector& operator=( std::initializer_list<T> ilist );
3、迭代器
iterator begin(); // 返回vector迭代器到第一个元素
const_iterator cbegin(); // 返回vector迭代器到第一个元素
iterator end(); // 返回vector迭代器到最后一个元素
const_iterator cend(); // 返回vector迭代器到最后一个元素
reverse_iterator rbegin(); // 返回vector反向迭代器到第一个元素
const_reverse_iterator crbegin();// 返回vector反向迭代器到第一个元素
reverse_iterator rend(); // 返回vector反向迭代器到最后一个元素
const_reverse_iterator crend(); // 返回vector反向迭代器到最后一个元素
4、容量相关
bool empty(); // 判断容器是否为空
size_type size();// 返回容器中当前元素个数
size_type max_size(); //返回容器内可存放的最大元素个数
// 调整容器大小,使其只包含其前n个元素,若n>size,则使用默认值初始化。
void resize (size_type n);
// 调整容器大小,使其只包含其前n个元素,若n>size,则使用val初始化。
void resize (size_type n, const value_type& val);
size_type capacity(); // 返回当前为容器分配的存储空间的大小
/* 修改容器容量至少可以包含n个元素,若n>size,则容器会重新分配内容,将容量增加到n(或更大)
在所有其他情况下,函数调用不会导致重新分配并且容器容量不受影响*/
void reserve (size_type n);
5、元素访问
reference operator[] (size_type n);// 返回对vector容器中位置n处元素的引用,若n超出容器的size,该场景是未定义行为
reference at (size_type n);// 返回对vector容器中位置n处元素的引用,若n超出容器的size,将抛出out_of_range 异常
reference back(); // 返回vector中最后1个元素
reference front(); // 返回vector中第1个元素
// 返回指向vector内部用于存储其拥有元素的内存数组的指针,可以使用该指针进行偏移以访问数组中的任何元素
value_type* data();
6、容器更改
// 将vector的元素使用count个value元素进行复制覆盖
void assign( size_type count, const T& value );
// 将vector的元素使用[first,last)的元素进行复制覆盖
template< class InputIt >
void assign( InputIt first, InputIt last );
// 将vector的元素使用初始化列表里的元素进行复制覆盖
void assign( std::initializer_list<T> ilist );
// 复制或移动元素val至容器末尾位置
void push_back(const value_type& val);
void push_back(value_type&& val);
// 从容器末尾位置删除一个元素
void pop_back();
// 在position位置插入元素val
iterator insert (const_iterator position, value_type&& val);
iterator insert (const_iterator position, const value_type& val);
// 在position位置插入n个元素val
iterator insert (const_iterator position, size_type n, const value_type& val);
// 在position位置插入元素[first,last)
iterator insert (const_iterator position, InputIterator first, InputIterator last);
// 在position位置插入一个initializer_list对象
iterator insert (const_iterator position, initializer_list<value_type> il);
// 从vector容器中删除单个元素position
iterator erase (const_iterator position);
// 从vector容器中删除一系列元素 [first,last)
iterator erase (const_iterator first, const_iterator last);
// 与vector容器x互换内容
void swap (vector& x);
// 从vector容器中移除所有元素(已销毁),并保留大小为0的容器。
void clear();
// 使用args作为构造参数就地构造新元素,并将其放入容器末尾位置
void emplace_back (Args&&... args);
// 通过在position插入一个新元素来扩展容器,这个新元素是使用args作为构造参数就地构造的。
iterator emplace (const_iterator position, Args&&... args);