vector类使用介绍

vector类使用介绍

简介

标准库类型vector表示对象的集合,其中所有对象的类型都相同。
它是可变大小的数组,支持快速随机访问。因为 vector "容纳着"其他对象,所以也常被称为容器

头文件引入

想要使用 vector,必须包含适当的头文件。假定在后续的例子中都进行了如下声明:

#include<vector>
using namespace std;

vector对象的定义和初始化

定义vector对象的常用方法

//T为容纳的数据类型
vector<T> v1;               //v1是一个空的vector,它容纳的元素是T类型的,执行默认初始化
vector<T> v2(v1);           //用v1拷贝构造v2
vector<T> v2 = v1;          //与上一句等价
vector<T> v3(n,val);        //v3包含n个重复元素,每个元素的值都是val
vector<T> v4(n);            //v4包含n个重复执行了值初始化的对象
vector<T> v5{a,b,c};        //v5包含了初始值个数的元素,每个元素都赋予了对应的初始值
vector<T> v5 = {a,b,c};     //与上一句等价

其他定义vector对象的方法

//用数组初始化vector
int array[]={1,2,3,4,5,6};
vector<int> v1(array,array+6);
//用memset初始化vector
vector<int> v2;
memset(v2.data(),0,v2.size()*sizeof(int));

向vector对象中添加元素

//用成员函数push_back()在尾部添加元素
vector<int> v{1,2,3,4,5,6};
v.push_back(7);

这样的操作有点类似于栈结构的入栈操作。
不可避免的,如果vector空间已满,那么元素会如何添加进去呢?
这就涉及到了vector的动态变化机制,之后的文章会进行详细解释。

vector的其他操作

vector<int> v,v1,v2;
//基本操作
v.[n];              //对下标进行索引
v1 = v2;            //用v2中元素的拷贝替换v1中的元素
v1 = {1,2,3,4,5,6}; //用列表中元素的拷贝替换v1中的元素
v1 == v2;           //v1和v2相等当且仅当他们的元素数量相同且对应位置的元素值都相等
v1 != v2;           
//
v.empty();          //如果v不含任何元素,返回真;否则返回假
v.size();           //返回v中元素的个数
v.capacity();       //返回v的容量大小
v.pop_back();       //删除v的最后一个元素
v.clear();          //清空v中的所有元素
v.resize(n);        //重新指定v的容量为n
v.reserve(n);        //重新指定v的容量为n(如果n不小于当前容量大小)
v1.swap(v2);        //交换v1和v2的所有元素
swap(v1,v2);        //同上

tip:

注意size()和capacity()函数的区别,前者返回的是已经容纳的元素的个数,后者是实际能够容纳多少个元素,通过监视后者值的变化我们可以了解push_back()时容量是如何动态变化的。

常见错误

1.类中的vector

在用带参构造函数对vector进行定义时,可能会出现如下错误(在结构体中这样定义vector也会出现类似报错)

class A
{
private:
    vector<int> _data_1(2);     //报错:应输入类型说明符
    vector<int> _data_2(2,0);   //报错:应输入类型说明符
};

原因在于
vector是封装的类,在一个类中定义另一个类时,会出现这样的报错。
这里在一个类中定义vector的时候同时调用了vector的带参构造函数进行直接初始化

解决方案

我们可以将vector的初始化放到构造函数中

class A
{
private:
    vector<int> _data_1;
    vector<int> _data_2;
public:
    A():_data_1(2),_data_2(2,0){}
}

既然不能使用直接初始化,我们可以使用拷贝式初始化

class A
{
private:
    vector<int> _data_1{0,0};
    vector<int> _data_2 = {0,0};
}

参考书籍

C++ Primer 中文版(第五版)

posted @ 2022-06-08 16:46  Vergissmeinnicht_z  阅读(374)  评论(0编辑  收藏  举报