本节大纲:
vector全方面讲解及其代码模拟实现
1.学习vector方法
2.vector的使用
2.1 vector的定义
2.2 vector iterator 的使用
2.3 vector 空间增长问题
2.4 vector 增删查改
2.5 vector 迭代器失效问题(重点)
3.vector 深度刨析
4.vector的模拟实现
目录
vector全方面讲解及其代码模拟实现
1.学习vector方法
2.vector的使用
2.1 vector的定义
2.2 vector iterator 的使用
2.3 vector 空间增长问题
2.4 vector 增删查改
2.5 vector 迭代器失效问题(重点)
3.vector 深度刨析
4.vector的模拟实现
1. 学习vector方法
学习使用vector的方法和使用STL的境界是一样的,要能做到以下三点:
(1)能用
(2)明理
(3)能扩展
这样才可以对vector展现很好的理解。
2.vector的使用(所有的实现都会在vector(2)中展现,目前只是声明讲解,了解一下)
2.1 vector的定义
下图是vector的构造函数及其简易说明讲解:
2.2 vector iterator 的使用
2.3 vector 空间增长问题
注意:
(1)capacity的代码在vs和g++下分别运行会发现,vs下capacity是按1.5倍增长的,g++是按2倍增长的。
2.4 vector增删查改
2.5 vector 迭代器失效问题
迭代器的主要作用就是让算法能够不用关心底层数据结构,其底层实际就是一个指针,或者是对 指针进行了封装,比如:vector的迭代器就是原生态指针T* 。因此迭代器失效,实际就是迭代器 底层对应指针所指向的空间被销毁了,而使用一块已经被释放的空间,造成的后果是程序崩溃(即 如果继续使用已经失效的迭代器,程序可能会崩溃)。
在vector中可能导致迭代器失效的操作有:
(1)会引起其底层空间改变的操作,都有可能是迭代器失效(比如:resize、reserve、insert、 assign、push_back等。)
1.1 reserve的作用就是改变扩容大小但不改变有效元素个数,操作期间可能会引起底层容量改变
1.2 vector底层原理旧空间被释 放掉,而在打印时,it还使用的是释放之间的旧空间,在对it迭代器操作时,实际操作的是一块 已经被释放的空间,而引起代码运行时崩溃。
(2)指定位置的删除操作(例如earse)
erase删除pos位置元素后,pos位置之后的元素会往前搬移,没有导致底层空间的改变,理 论上讲迭代器不应该会失效,但是:如果pos刚好是最后一个元素,删完之后pos刚好是end 的位置,而end位置是没有元素的,那么pos就失效了。因此删除vector中任意位置上元素 时,vs就认为该位置迭代器失效了。
(3)Linux下,g++编译器对迭代器失效的检测并不是非常严格,处理也没有vs下极端。(相对于这点而言vs处理过于极端,毕竟程序崩溃)
3.vector 深度刨析
下面将来用一张图来展现:
4.vector的模拟实现
vector的模拟实现成员变量以及iterator迭代器:
(1)上面两个函数获取第一个数据和最后一个数据的下一个位置,下面两个相反。
(2)尾插。
(3)尾删。
(4)在pos位置之前插入x。
(5)删除pos位置的数据。
(6)构造函数。
(7)赋值。
(8)析构函数。
(9)返回数据个数和空间大小。
(10)改变vector的capacity。
(11)改变vector的size。
(12)像数组一样访问vector。
基本的模拟实现结束啦,本节到此结束,如果对你的理解有帮助的话,点赞加收藏,谢谢哦!!!!