C++中的容器——vector

Mrlossry 2024-10-02 12:35:01 阅读 98

1. vector的介绍

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

1.1 vector的成员变量

<code>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迭代器失效的原因

操作引起底层的空间改变。

<code>#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;

}

指定位置元素的删除操作(erase函数)。当erase函数对vector的元素进行删除时,传入的迭代器指向需要删除元素的位置,删除该元素,后面的元素占据该位置。这时该迭代器就变成指向后面元素,这种情况也认为是迭代器失效。(在vs中是直接运行崩溃,但是在Linux中是可以的,能不能用该迭代器进行数据访问还是要看具体的编译器)

4. 模拟实现vector容器

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



声明

本文内容仅代表作者观点,或转载于其他网站,本站不以此文作为商业用途
如有涉及侵权,请联系本站进行删除
转载本站原创文章,请注明来源及作者。