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 中文版(第五版)
本文来自博客园,作者:Vergissmeinnicht_z,转载请注明原文链接:https://www.cnblogs.com/Vergissmeinnicht-rj/p/16356252.html,欢迎访问本人个人主页:https://vergiss.cn