vector

一.vector概述

vector的数据安排及操作方式类似于array,但是array是静态空间,而vector是动态空间,随着元素的加入它的内部会自动扩充空间。

vector的实现关键在于对大小的控制和对重新配置时的数据移动效率。

二.vector定义摘要

这个定义摘要倒没什么好说的,就是把vector定义中一些比较关键的定义展示出来了,本来想写一下这个迭代器的,发现下一节讲的就是迭代器,不过看了这些个定义,还是对vector的使用有很大好处的,至少知道原来那么写那么用的原理的是什么。反正这个是自己看书上的代码。

三.vector的迭代器

在上面的定义摘要中我们也可以看到vector的迭代器其实就是T*,因为vecotr和array数据安排和操作方式都很类似,所以用原生指针作为vector的迭代器就OK了,至于iterator_traits和__type_traits就是直接用的特化版本的。

四.vector的数据结构

vector的数据结构就是最简单的线性连续空间,这里要注意的就是vector的容量问题,容量不是vector的当前大小,而是vector的总空间大小,如果容量不够了,则vector会经过重新配置,元素移动,释放原空间等系列工作将配置扩充至两倍或更大。

五.vecotr的构造与内存管理

vector的构造函数有很多,这个就不一一说明了,关键是vector的内存管理,即初始分配内存,释放内存,还有空间不够时配置新的空间。这里面最关键的是空间不够时配置新的空间。

(配置新空间里面有几个不懂的地方可能要看到下一节insert函数才懂),首先是在push_back里面,如果空间不够了,就调用insert_aux函数,如果还有空间直接配置即可,如果没有空间了就要找到新的空间,一般是两倍与原来的空间,然后把原来的对象复制过来,把原来的对象析构了(其实因为vector这里面迭代器用的就是原生指针,析构啥事也不做),把原来的空间释放了(注意,destroy是析构对象,并没有释放空间,要用dellocate来释放空间),然后把start和finish以及end_of_storage重新定位即可。

注意,这里在使用的时候就有一个易错点,因为这里是重新配置的空间,所以之前的指针就不管用了,加入之前我们让一个指针(或者说迭代器)指向vector的开头(通过复制first),那现在它指向的那个空间已经无意义了,再使用就会出错。

补充:insert_aux函数有可能被当做insert函数调用,所以里面对空间的分配也要考虑insert操作,所以用insert操作的逻辑去看里面的一些操作就懂了。

六.vector的元素操作

pop_back():就简单的finish前移和析构。

erase():清楚所有元素,注意vector是线性排列的数据,所以erase中要保持数据线性排列,所以直接copy覆盖掉要erase的数据即可。

insert():首先是空间还够的情况下,又分两种情况,这里分两种情况主要是为了提高效率(但是我不知道怎么就提升效率了),然后就是空间不够的情况下,和insert_aux的操作差不多,只不过这里插入的是多个数据而已。

七.小结

vector是存储线性数据关系且有动态空间的容器,迭代器为原生指针,有多种构造函数,还包括insert,pop_back,push_back,erase等一系列操作。vector最关键在于动态空间,而动态空间的保证在于一旦容量用尽,就重新配置一个更大的空间以存储原来的数据,重新配置的这个空间与原来的空间没有关系,原来的指针不能再用。涉及空间的操作有一点点绕,可以结合着图或者自己画个图来理解。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
05-29
C++ 中,vector 是一个动态数组容器,可以存储任意类型的数据。使用 vector 可以方便地进行动态内存分配和管理,而不需要手动进行内存分配和释放。 vector 提供了一系列的成员函数,可以方便地进行元素的插入、删除、查找和访问等操作。以下是一些常用的操作: 1. 创建 vector 对象: ```c++ #include <vector> std::vector<int> vec; // 创建一个空的 vector std::vector<int> vec1(10); // 创建一个包含 10 个默认值的 vector std::vector<int> vec2(10, 0); // 创建一个包含 10 个值为 0 的 vector std::vector<int> vec3 = {1, 2, 3, 4}; // 创建一个包含 4 个元素的 vector,初始值为 1, 2, 3, 4 std::vector<int> vec4(vec3); // 创建一个与 vec3 完全相同的新 vector ``` 2. 访问 vector 中的元素: ```c++ std::vector<int> vec = {1, 2, 3, 4}; std::cout << vec[0] << std::endl; // 访问第一个元素,输出 1 std::cout << vec.at(2) << std::endl; // 访问第三个元素,输出 3 std::cout << vec.front() << std::endl; // 访问第一个元素,输出 1 std::cout << vec.back() << std::endl; // 访问最后一个元素,输出 4 ``` 3. 插入和删除元素: ```c++ std::vector<int> vec = {1, 2, 3, 4}; vec.push_back(5); // 在末尾插入元素 5 vec.insert(vec.begin() + 2, 10); // 在第三个位置插入元素 10 vec.erase(vec.begin() + 1); // 删除第二个元素 ``` 4. 获取 vector 中的信息: ```c++ std::vector<int> vec = {1, 2, 3, 4}; std::cout << vec.size() << std::endl; // 输出 vector 的大小,即元素个数,输出 4 std::cout << vec.empty() << std::endl; // 判断 vector 是否为空,输出 0(因为不为空) ``` vector 还提供了一些其他的函数,如排序、反转、查找等,具体可以参考 C++ 标准库的文档。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值