前言:
本篇仅介绍vector中常用的函数接口,如果需要详细的请到官网查看。
vector是一种动态数组,能够自动调整大小。与数组类似,vector使用连续内存来存储元素,允许高效访问,但可以动态增加容量。为了应对容量增长,向量会在需要时重新分配内存,但这种重新分配是按对数级增长的,从而确保在末尾添加元素时操作平均时间复杂度为常数。
与其他动态序列容器相比,向量在访问和在末尾添加或删除元素时最为高效,但在中间插入或删除元素时性能较差(与顺序表类似),并且链表(list)和双向链表,它的迭代器和引用一致性较差。
并且vector是一个类模板,这就意味着vector可以同时存储不同类型的数据,如:int,char,甚至是自定义类型,如string。使用方式为 vector<类型> 变量。
vector的成员变量:
从上图看到,在vector中的成员变量不像之前的sting,他采用了三个类模板的指针变量,_start(开始) , _finish(完成), _end_of_storage(结尾的存储位置),分别对应了str的指针,top以及capacity。
vector相关的接口函数
构造函数接口:
1.vector ();无参构造
可以看到,当使用无参构造时,vector里的数据以及容量都为0;
2.vector (const vector& x);拷贝构造
从上图可以看出,一开始创建了vector<int>类型的v1,并且通过push_back函数(这个函数后面会说明),对v1进行插值,接着又创建了v2并以v1为拷贝对象使用拷贝构造,使用范围for打印结果可以看出,v2把v1的数据进行了拷贝,并同时也进行了扩容的操作。
迭代器接口函数
1.iterator begin( )
2.iterator end( )
通常begin()函数与end()函数还是是拿来构建迭代器指针的,为后面的insert与erase做准备( 后面会说明),同时有了begin()函数与end()函数就可以使用迭代器遍历vector或使用范围for(底层就是迭代器)。
关于容量的接口函数
1.size_type size() const;返回vector对象的有效数据长度
2.size_type capacity() const;返回vector对象的容量
通过上图代码可以看到,当循环往v1中插入值,它的capacity是处于一个1.5倍的增长速度。
3.void resize (size_type n);改变当前vector对象的size状态
4.void reserve (size_type n); 改变vector的capacity状态
vector的增删改查函数接口
1.void push_back (const value_type& val);尾插一个值
2.void pop_back();尾删一个值
从上图可以看到,pop_back会修改size中的数据,而并不会修改capacity的值,这是为了防止当对象再次插入值的时候又进行扩容而扩容就会付出一定的代价。
3.iterator insert (iterator position, const value_type& val);pos位置插入一个值
4.1 iterator erase (iterator position);
4.2iterator erase (iterator first, iterator last);
关于vector中迭代器失效的问题:
在 C++ 中,迭代器失效是一个重要的概念,指的是对容器进行修改操作(如插入、删除元素)时,可能导致原有迭代器变得无效,从而导致未定义行为。
失效的原因
迭代器失效发生的主要原因是容器的底层数据结构被修改,导致原有的迭代器指向的内存位置发生变化。例如:
插入操作:在某些容器中,插入操作可能会导致底层数据结构的重新分配(如 std::vector
的扩容),从而使所有迭代器失效。
删除操作:删除元素可能会导致容器中元素的位置发生改变,从而使得指向被删除元素的迭代器失效。
从上图可以看到当如果插入值时候,正好需要扩容,发生扩容后原数据会拷贝到新内存,而迭代器这里也只是传值不是传引用,在函数里的迭代器的改变不会影响主函数,所以此时it就变成了野指针,如果再继续使用就会有不可预知的风险。
那么erase也是有同样的风险
5.vector:operator[ ] 允许迭代器像数组一样访问其中的元素
————那么以上就是对于vector中小编的一些简单介绍,如有错误还请指出,感谢各位观看!