)
vector介绍vector的中文意思是向量其实就是数据结构中的顺序表它的物理地址是连续的理解起来相对简单并且也容易模拟实现。下面我们首先介绍vector的常用接口再尝试模拟实现。(constructor)构造函数vector()无参数构造vector(const vector x)拷贝构造vectorsize_type n, const value_type val value_type()了解构造并以n个value初始化vector (InputIterator first, InputIterator last);使用迭代器进行初始化迭代器beginend分别返回指向第一个数据的iterator和指向最后一个数据的下一个位置的iteratorrbeginrend分别返回指向最后一个数据的iterator和指向第一个数据的前一个位置的iterator容量处理size返回有效数据个数capacity返回容量大小empty判断是否为空resize改变有效数据个数底层与string类似reserve改变容量底层与string类似编译器并不都是2倍扩容如果事先知道容量可以用reserve先开出容量避免多次扩容提高效率增删查改push_back尾插pop_back尾删operator[]可以同数组一般获取数据insert指定位置插入erase删除指定位置数据swap交换两个vectorfindvector并未实现此函数这是算法库中的函数返回所要查找的数据的iteratorvector模拟实现学习的经验了解一个未知类时先看私有成员如果看不出私有成员的意义我们则从成员函数辅助认识比如begin函数end函数以及push_back函数等vector的私有成员如下iterator _start; iterator _finish; iterator _end_of_storage;在此我就不卖关子了_start即为指向vector第一个数据的迭代器_finish为指向vector最后一个数据的下一个位置的迭代器——_startsize_end_of_storage为vector所开辟的动态内存的下一个位置——_startcapacity上图是vector的迭代器简单实现因为其底层物理地址是连续的我们可以简单实现构造函数默认构造函数在此再添加一个知识点如果我们实现了拷贝构造或者其他构造函数但未实现默认构造函数这时编译器由于检测到有构造函数存在便不会自己实现默认构造函数而我们可以使用如下指令强制编译器自己实现vector() default;使用列表初始化拷贝构造任意类型容器迭代器初始化初始化为n个t析构函数size函数capacity函数reserve函数resize函数operator[]函数push_back函数pop_back函数clear函数erase函数按照之前的思路erase函数如此设计即可在此我们引入一个迭代器失效问题即迭代器底层对应指针所指向的空间被销毁了而使用一块已经被释放的空间。如果容器底层空间被修改如inserterase等函数我们都认为迭代器失效如上述测试时目的是删除偶数结构却只删除了第一个第二个跳过了解决方案令erase函数的返回值为迭代器指向所删除数据的下一个数据insert函数同erase函数按之前设计方式会出现迭代器失效问题解决方法我们令insert函数的返回值为迭代器指向所插入数据empty函数引申构造函数中的使用迭代器初始化为适配其他容器实现方式为模板与初始化为n个t值在使用中会可能会出现冲突vectorint vec(4, 8);//本意是初始化为4个8但编译器会调用最适配的函数调用了 //使用迭代器来初始化的那个构造函数具体解决措施在源码中可以看到用到了C17的知识有兴趣的可以去了解一下