STL | vector操作总结

vector

随机访问 在序列末尾插入和删除元素为常量时间,而在中间插入和删除元素需要线性时间

介绍

  • vector为可变长的数组(动态数组),定义的vector数组可以随时添加和删除元素
  • 当vector容量不足以容纳新增元素时会扩容为两倍(不同编译器有不同的实现,GCC以两倍扩容),需要将元素复制到新开辟的空间

在局部作用域中vector数组是开辟在堆区的,而普通数组是开辟在栈区的
因为栈的大小通常较小,所以如果要开辟很大的数组要用vector

头文件

#include <vector>

初始化

// 默认初始化
vector();

// 初始化指定大小的vector
explict vector(size_type count);
// 初始化指定大小的vector并赋值为指定value
vector(size_type count, const Type& value);

// 用vector初始化vector
vector(const vector& source);
vector(vector&& source);

// 用迭代器指定范围的元素初始化vector
template <class InputIterator>
vector(InputIterator first, InputIterator last);

创建指定大小的二维数组

// 方法一
int m = 2, n = 3;
vector<vector<int> vec(m, vector<int>(n));

// 方法二
vector<vector<int> vec;
vec.resize(m);
for(int i = 0; i < m; ++i) {
    vec[i].resize(n);
}

函数

assign

清空vector并将指定元素复制到vector

// assign
void assign(size_type count, const Type& value);
// 初始化列表
void assign(initializer_list<Type> ini_list);

template <class InputIterator>
void assign(InputerIterator first, InputIterator last);

at

  • 返回指定位置的元素
  • 尝试返回不存在的位置时抛出异常
reference at(size_type position);

const_reference at(size_type position);

back

  • 返回对向量中最后一个元素的引用
  • 如果vector为空,则返回值不确定
reference back();
const_reference back() const; // 第二个const保证了该函数不会改变对象的状态

begin

  • 返回vector指向第一个元素的迭代器
  • 如果vector为空则返回容器开始的位置,这时和end返回的位置相同
const_iterator begin() const;
iterator begin();

capacity

返回在不分配更多的存储的情况下vector可以包含的元素个数

size_type capacity() const;

cbegin

  • 返回第一个元素地址的const迭代器
  • 对于空vector,cbegin == cend
const_iterator cbegin() const;

cend

返回指向最后一个元素后面一个位置

const_interator cend() const;

clear

  • 清除vector中的元素
  • 调用之后size变为0,capacity不变
void clear();

crbegin

返回指向最后一个元素的const迭代器

const_reverse_iterator crbegin() const;

crend

返回指向第一个元素前面一个位置的迭代器

const_reverse_iterator crend() const;

data

返回指向第一个元素的指针,不提供范围检查(使用时要小心)

const_pointer data() const;
pointer data();

empty

vector为空返回true,否则返回false
bool empty() const;

end

返回vector最后一个元素的后一个位置的迭代器

iterator end();
const_iterator end() const;

erase

  • 从指定位置删除元素
  • 返回操作之后的vector的第一个元素的位置
  • 时间复杂度为o(n)
iterator erase(const_iterator position);
iterator erase(const_iterator first, const_iterator last);

front

  • 返回vector中第一个元素的引用
  • 若vector为空,返回值不确定
reference front();
const_reference front() const;

insert

返回的迭代器指向新插入的元素

iterator insert(const_iterator position, const Type& value);
iterator insert(const_iterator position, const Type&& value);
void insert(const_iterator position, size_type count, const Type& value);

template <class InputIterator>
void insert(const_iterator position, InputIterator first, InputIterator last);

max_size

  • 返回vector最大可取长度
  • 取决于系统内存容量
size_type max_size() const;

pop_back

删除末尾元素

void pop_back();

push_back

在尾部添加元素

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

rbegin

返回反向第一个元素

reverse_iterator rbegin();
const_reverse_iterator rbegin() const;

rend

返回反向最后一个元素的后一个位置

const_reverse_iterator rend() const;
reverse_iterator rend();

reserve

  • 预留长度
  • 不会影响size,如果reserve小于size则什么都不做
  • 如果capacity已经足够大,则什么都不做
void reserve(size_type count);

resize

为vector指定新的大小

void resize(size_type new_size);
// value表示新插入的元素值
void resize(size_type new_size, Type value);

shrink_to_fit

放弃额外容量

void shrink_to_fit();

size

返回vector中的元素数量

size_type size() const;

swap

交换两个vector中的元素

// 不需要显示指定分配器
void swap(vector<Type, Allocator>& right);
friend void swap(vector<Type, Allocator>& left, Allocator>& right);

运算符

operator[]

  • 返回指定位置元素的引用,
  • 如果访问越界发生错误,没有at安全
reference operator[](size_type position);
const_reference operator[](size_type position) const;

operator=

vector& operator=(const vector& right);
vector& operator=(vector&& right);

operator==

时间复杂度为o(n)

bool operator==(const vector<Type, Allocator>& left, const vector<Type, Allocator>& right);
posted @ 2024-05-17 09:39  深蓝von  阅读(59)  评论(0编辑  收藏  举报