Vector的理解与使用大全(C++)

本文详细介绍了C++中的Vector容器,包括其与数组的区别、初始化方式、访问元素的方法、相关函数及其功能。Vector作为动态数组,提供了灵活的大小调整和便捷的内存管理,支持多种插入、删除、查找操作。了解这些内容有助于更高效地使用C++中的Vector。
摘要由CSDN通过智能技术生成

吐血整理,未经本人允许,不可转载。

一.关于Vector

1. 什么是vector?
向量(Vector)是一个封装了动态大小数组的顺序容器(Sequence Container)。跟任意其它类型容器一样,它能够存放各种类型的对象。可以简单的认为,向量是一个能够存放任意类型的动态数组。

2. vector与数组的区别?

  • 内存中的位置
    C++中数组为内置的数据类型,存放在栈中,其内存的分配和释放完全由系统自动完成;vector,存放在堆中,由STL库中程序负责内存的分配和释放,使用方便。
  • 大小能否变化
    数组的大小在初始化后就固定不变,而vector可以通过push_back或pop等操作进行变化。
  • 初始化
    数组不能将数组的内容拷贝给其他数组作为初始值,也不能用数组为其他数组赋值;而向量可以。
  • 执行效率
    数组>vector向量。主要原因是vector的扩容过程要消耗大量的时间。

功能上vector可以完成取代原生数组。

二.Vector的初始化与访问

使用前提:

#include <vector>
using namespace std;

vector 初始化方式:

1 vector<T> v1;                   //v1为空,执行默认初始化

2 vector<T> v2(v1);               //v2中包含v1所有元素的副本
3 vector<T> v2=v1;                //v2中包含v1所有元素的副本

4 vector<T> v3(n,val);            //v3中包含n个重复元素,每个元素的值都是val
5 vector<T> v4(n);                //v4包含n个重复执行了值初始化的对象

6 vector<T> v5{a,b,c...};         //包含初始化元素个数,每个元素被对应的赋予相应的值
7 vector<T> v5={a,b,c...};        //包含初始化元素个数,每个元素被对应的赋予相应的值

三.Vector相关函数

1. 迭代器 Iterators:

序号指令功能
1iterator begin()返回指向容器头部的迭代器。
2iterator end()返回指向容器尾部的迭代器。
3reverse_iterator rbegin()返回指向容器尾部的反向迭代器。
4reverse_iterator rend()返回指向容器头部的反向迭代器。
5const_iterator cbegin()返回指向常量头部的迭代器。
6const_iterator cend()返回指向常量尾部的迭代器。
7const_reverse_iterator crbegin()返回指向尾部的常量反向迭代器。
8const_reverse_iterator crend()返回指向头部的常量反向迭代器。

注意:
1. 迭代器(iterator)的使用类似于指针的使用。要访问顺序容器和关联容器中的元素,需要通过迭代器进行。迭代器是一个变量,相当于容器和操纵容器的算法之间的中介。迭代器可以指向容器中的某个元素,通过迭代器就可以读写它指向的元素。从这一点上看,迭代器和指针类似。详细用法请参考官网或自行百度。
2. 反向迭代器(reverse iterator)是一种反向遍历容器的迭代器。
3. 常量迭代器(const_iterator):不能通过迭代器修改所指向的内容,但是迭代器本身指向可变。常量反向迭代器(const_reverse_iterator )也类似。

2. 大小与容量 Size and Capacity:

序号指令功能
1int size()返回容器的大小(size)。
2int max_size()返回容器能持有的最大元素的个数(maximum size)。
3bool empty()判断容器大小(size)是否为空,容器大小为0返回true,否则返回false。
4void resize(int n, T val)重新调整容器大小(size),使其含有n个元素。当n大于现有元素数量,则多出的元素的值等于val。
5int capacity()返回容器的容量(capacity),该值大于等于max_size()获得的值,并在容量耗尽时自动扩大。
6void reserve(int n)调整容器容量(capacity)。当n大于容器大小(size)时,扩大容量使得其大于等于n。
7void shrink_to_fit()缩小容器的容量(capacity)使其适应其大小(size)。

注意:
1. 注意区分容器大小(size)和容器容量(capacity)。容器大小,指的是它实际所包含的元素个数;容器容量,指的是在不分配更多内存的情况下,容器可以保存的最多元素个数。一般情况下容量>=大小 。
2. 容器的大小一旦超过容量,vector会重新配置内部的存储器,导致和vector元素相关的所有reference、pointers、iterator都会失效。

3. 元素访问 Element access:

序号指令功能
1T operator[int n]返回访问位置为n元素的引用,不做边界检查。T为初始化时容器元素的数据类型
2T at(int n)返回访问位置为n元素的引用,做边界检查。T为初始化时容器元素的数据类型
3T front()返回容器的首位元素的引用。
4T back()返回容器的末尾元素的引用。
5T* data返回指向容器内部用于存储其拥有元素的内存数组的指针。

注意:
1. operator[ ]和at的主要区别在于是否做边界检查。由于operator[ ]不做边界检查, 哪怕越界了也会返回一个引用,当然这个引用是错误的引用,如果不小心调用了这个引用对象的话,会直接导致应用退出。而由于at会做边界检查,如果越界,会抛出异常,应用可以try catch这个异常,应用还能继续运行。
2. 在空容器中调用front()和back()会出现未定义的行为。

4. 编辑 Modifiers:

序号指令功能
1void assign(int n, T& x)设置容器中前n个元素的值为x。
2void assign(const_iterator first,const_iterator last)容器中[first,last)中元素设置成当前容器元素。
3void push_back( T &x)在容器尾部添加一个新元素x。
4void pop_back( )删除容器的最后一个元素。
5iterator insert(iterator it, T& x)迭代器 it 指向元素前增加一个元素x,返回指向x的迭代器。
6iterator insert(iterator it,int n, T& x)迭代器 it 指向元素前增加n个相同的元素x。
7iterator insert(iterator it,const_iterator first,const_iterator last)迭代器 it 指向元素前插入另一个相同类型向量的[first,last)间的数据。返回新插入第一个元素的迭代器。
8iterator erase(iterator it)删除迭代器 it 所指向的元素。返回被删除的最后一个元素的后一个元素的迭代器。
9iterator erase(iterator first,iterator last)删除容量中[first,last)中元素。返回被删除的最后一个元素的后一个元素的迭代器。
10void swap(vector& x)交换两个同类型容器的数据。
11void clear()清空容器中所有元素。
12iterator emplace(const_iterator it ,T&x )在迭代器 it 指向之前插入元素x,并返回指向x的迭代器。
13void emplace_back(T &x)在容器尾部添加一个新元素x,用法与push_back类似。

5.分配器 Allocator:

序号指令功能
1allocator_type get_allocator()返回vector的内存分配器。

四.相关链接

  1. C++官方Vector解读:http://cplusplus.com/reference/vector/vector/
  2. C++官方手册:http://cplusplus.com/
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

冬瓜~

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值