目录
vector介绍:
C++ 中的 vector 是一种序列容器,它允许你在运行时动态地插入和删除元素。
vector 是基于数组的数据结构,但它可以自动管理内存,这意味着你不需要手动分配和释放内存
与 C++ 数组相比,vector 具有更多的灵活性和功能,使其成为 C++ 中常用的数据结构之一。
vector 是 C++ 标准模板库(STL)的一部分,提供了灵活的接口和高效的操作。
基本特性:
- 动态大小:
vector
的大小可以根据需要自动增长和缩小。 - 连续存储:
vector
中的元素在内存中是连续存储的,这使得访问元素非常快速。 - 可迭代:
vector
可以被迭代,你可以使用循环(如for
循环)来访问它的元素。 - 元素类型:
vector
可以存储任何类型的元素,包括内置类型、对象、指针等。
使用场景:
- 当你需要一个可以动态增长和缩小的数组时。
- 当你需要频繁地在序列的末尾添加或移除元素时。
- 当你需要一个可以高效随机访问元素的容器时。
要使用 vector,首先需要包含 <vector> 头文件:#include <vector>
Vector的各种用法:
1. 基本构造函数
-
默认构造函数:
std::vector<int> vec;
创建一个空的
vector
。 -
指定大小的构造函数:
std::vector<int> vec(size_t n);
创建一个包含
n
个元素的vector
,元素值初始化为默认值(对于基本类型为 0)。 -
指定大小和初始值的构造函数:
std::vector<int> vec(size_t n, const int& value);
创建一个包含
n
个元素的vector
,所有元素初始化为value
。 -
拷贝构造函数:
std::vector<int> vec(const std::vector<int>& other);
通过拷贝另一个
vector
的内容来初始化。 -
移动构造函数:
std::vector<int> vec(std::vector<int>&& other) noexcept;
通过移动另一个
vector
的内容来初始化,避免不必要的拷贝。
2. 赋值运算符
-
拷贝赋值运算符:
std::vector<int>& operator=(const std::vector<int>& other);
将一个
vector
的内容复制到另一个vector
。 -
移动赋值运算符:
std::vector<int>& operator=(std::vector<int>&& other) noexcept;
将一个
vector
的内容移动到另一个vector
。
3. 大小和容量
-
size()
:size_t size() const;
返回当前
vector
中元素的数量。 -
capacity()
:size_t capacity() const;
返回
vector
当前分配的容量(可以容纳的元素数量)。 -
empty()
:bool empty() const;
检查
vector
是否为空。 -
resize()
:void resize(size_t n); void resize(size_t n, const T& value);
调整
vector
的大小。如果新大小大于当前大小,新增的元素初始化为value
。 -
reserve()
:void reserve(size_t n);
请求分配至少能够容纳
n
个元素的空间,避免频繁的内存重分配。 -
shrink_to_fit()
:void shrink_to_fit();
请求减少
vector
的容量以适应其当前大小。
4. 访问元素
-
operator[]
:T& operator[](size_t n); const T& operator[](size_t n) const;
返回指定位置的元素,不进行边界检查。
-
at()
:T& at(size_t n); const T& at(size_t n) const;
返回指定位置的元素,进行边界检查。
-
front()
:T& front(); const T& front() const;
返回第一个元素的引用。
-
back()
:T& back(); const T& back() const;
返回最后一个元素的引用。
-
data()
:T* data(); const T* data() const;
返回指向
vector
中第一个元素的指针。
5. 修改元素
-
push_back()
:void push_back(const T& value); void push_back(T&& value);
在
vector
的末尾添加一个元素。 -
pop_back()
:void pop_back();
删除
vector
的最后一个元素。 -
insert()
:iterator insert(iterator pos, const T& value); iterator insert(iterator pos, T&& value); iterator insert(iterator pos, size_t n, const T& value); template <class InputIt> iterator insert(iterator pos, InputIt first, InputIt last);
在指定位置插入一个或多个元素。
-
erase()
:iterator erase(iterator pos); iterator erase(iterator first, iterator last);
删除指定位置或范围的元素。
-
clear()
:void clear();
删除所有元素。
6. 其他功能
-
swap()
:void swap(std::vector<T>& other) noexcept;
交换两个
vector
的内容。 -
assign()
:void assign(size_t n, const T& value); template <class InputIt> void assign(InputIt first, InputIt last);
重新赋值
vector
的内容。
7. 迭代器
std::vector
提供了多种迭代器支持,包括:
-
begin()
和 **end()
**:iterator begin(); iterator end(); const_iterator begin() const; const_iterator end() const;
返回指向第一个元素和最后一个元素之后位置的迭代器。
-
rbegin()
和rend()
:reverse_iterator rbegin(); reverse_iterator rend(); const_reverse_iterator rbegin() const; const_reverse_iterator rend() const;
返回指向最后一个元素和第一个元素之前位置的反向迭代器。
-
迭代器失效问题:
迭代器失效的原因
-
插入操作:
- 当在
vector
中插入元素时,如果当前存储的元素数量超过了其容量,vector
会重新分配内存,复制现有元素到新的内存位置,并释放旧的内存。这会导致所有指向旧内存的迭代器失效。
- 当在
-
删除操作:
- 当从
vector
中删除元素时,删除操作会导致后面的元素向前移动,以填补空缺。这会使得指向被删除元素的迭代器失效,且指向被移动元素的迭代器也可能失效。
- 当从
-
清空操作:
- 调用
clear()
方法会删除所有元素,导致所有迭代器失效。
- 调用
迭代器失效的影响
失效的迭代器可能会导致未定义行为,包括程序崩溃或数据损坏。因此,在使用迭代器时,必须小心处理插入和删除操作,在进行相关操作后应避免使用已经失效的迭代器。
迭代器失效的的返回值
在处理迭代器失效问题上,当迭代器失效时候会返回原本失效的下一个位置
举例:
我们可以看到在遇到0的时候erase之后迭代器失效再用会导致程序崩溃。
但是因为迭代器在erase的时候失效了但是erase还会返回失效前的下一个位置,我们再用迭代器去接收就可以正常运行