C++中的容器——vector

1. vector的介绍

vector:vector的底层实际上就是一个数组(也称为顺序表),数据是连续存储在数组中的,因此vector是可以使用下标来进行访问的,但是它的大小并不是像数组一样是固定的,而是可以动态调整的。

1.1 vector的成员变量
template<class T>
class vector
{
public:
        typedef T* iterator;
private:
          iterator _start=nullptr;
          iterator _end = nullptr;
          iterator _finish = nullptr;
}

成员变量是三个指针,分别指向数组中的第一个元素,指向数组的最后一个元素的后一个元素,指向数组中有效的最后元素的后一个元素。
vector的演示图

在这里插入图片描述

2. vector的使用

下面只是对常用的一个成员函数进行介绍,如需详细请自行访问vector的官方文档

构造函数:
vector() //无参构造
vector (const vector& x) //拷贝构造
vector (InputIterator first, InputIterator last)//迭代器区间构造

iterator的使用
begin()//获取第一个数据位置的iterator/const_iterator
end()//获取最后一个数据的下一个位置的iterator/const_iterator
rbegin()//获取最后一个数据位置的reverse_iterator
rend//获取第一个数据前一个位置的reverse_iterator

容量空间
size()//获取数据个数
capacity()//获取容量大小
empty()//判断数据量是否为空
resize()//改变vector中size的大小
recapacity()//改变vector中的capacity,但是一般只有当需要改变的量大于vector中的capacity,capacity才会改变,小于vector中的capacity一般是不会改变的。

增删改查
push_back()//尾插
pop_back()//尾删
find()//查找
erase()//删除指定位置的元素,还可以删除一个区间中的所有元素
insert()//在指定位置之前插入元素
operator//向数组一样访问元素

注:上面函数的功能不全,只是列举了一些常用的功能,还有很多少用的功能,这篇文章并没有过多介绍

3. vector的迭代器失效

迭代器:迭代器其实是一种封装的思想,其目的是为了,在不同的容器中,可以使用迭代器进行统一的访问和操作
vector的迭代器:vector的迭代器的底层实际上就是一个指针,迭代器失效也就是当指针所指向的内容被释放或者已经被销毁,这样很容易造成程序的崩溃。

vector迭代器失效的原因

  1. 操作引起底层的空间改变。
#include <iostream>
using namespace std;
#include <vector>

int main()
{
 vector<int> v{1,2,3,4,5,6};
 auto it = v.begin();
 recapacity(100);
 //在进行扩容时,realloc函数不能在原空间后面进行扩容,需要另外开辟空间,it原来所指向的空间内容被释放,这是it迭代器就失效了
 return 0;
 }
  1. 指定位置元素的删除操作(erase函数)。当erase函数对vector的元素进行删除时,传入的迭代器指向需要删除元素的位置,删除该元素,后面的元素占据该位置。这时该迭代器就变成指向后面元素,这种情况也认为是迭代器失效。(在vs中是直接运行崩溃,但是在Linux中是可以的,能不能用该迭代器进行数据访问还是要看具体的编译器)

4. 模拟实现vector容器

由于模拟的代码篇幅过长,请大家直接访问我的giteevector的模拟实现

### C++ 中 `vector` 容器的使用方法 #### 赋值操作符重载 赋值操作可以通过成员函数实现,允许一个向量的内容被另一个相同类型的向量所替换。这涉及到拷贝源向量中的元素到目标向量中,并释放原来分配给后者的所有内存资源[^1]。 ```cpp std::vector<int> vec1 = {1, 2, 3}; std::vector<int> vec2; vec2 = vec1; // 使用赋值运算符复制 vec1 到 vec2 ``` #### 迭代器支持 迭代器提供了访问容器内部存储的数据的方式。对于 `vector` 来说,可以创建指向其首尾位置的迭代器来进行遍历或者修改其中的元素。 #### 初始化方式 当定义多维数组时,需要注意语法格式以确保兼容性。例如,在较新的标准下可以直接声明而无需额外空格;但在某些旧版本编译环境下,则可能需要显式的分隔模板参数列表来避免解析错误[^2]: ```cpp // 正确的形式用于新编译器 std::vector<std::vector<int>> matrix; // 对于老旧编译环境应采用如下形式 std::vector<std::vector<int> > matrix_old_style; ``` 为了指定具体的行列数,可以在构造函数调用期间提供相应的尺寸参数: ```cpp size_t rows = 5; size_t cols = 4; std::vector<std::vector<int>> matrix(rows, std::vector<int>(cols)); ``` #### 动态调整大小 除了静态设定容量外,还可以利用诸如 `push_back()` 和 `pop_back()` 方法动态增加或减少元素数量。前者会在末尾追加单个项,而后者的功能是从末端移除一项: ```cpp matrix.push_back({0}); // 向矩阵的最后一行添加一列零值 matrix.back().push_back(7); // 或者直接扩展最后一行并设置特定数值 matrix.pop_back(); // 移除最底下的那一整行 ``` 另外还有清空整个集合的方法 `clear()`,它会使得当前对象变得为空状态而不改变它的最大容纳限度. #### 数据存取机制 一旦建立了有效的索引范围内的引用之后就可以像常规指针那样对待这些迭代器了——即能够解引用它们从而获取对应的实体变量或是执行写入动作.
评论 8
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值