std::vector<T>
需添加 vector模块
import <vector>;
vector是一个十分强大的序列容器,它不是一个向量,也属于一种数组,但它的长度不受限制,它会在需要更多空间时在内存开辟更大的空间将旧的vector拷贝过去然后删除旧的vector,以下是其声明的一个例子:
std::vector <double> values(20);
std::vector <double> values_1; //你甚至可以不设置数组大小,在需要时添加就可
values_1.push_back(20); //添加一个20的元素,作为第一个元素
values_1.emplace_back(10); //添加一个10的元素,作为第二个元素
//push_back和emplace_back的效果是一样的,但是前者是在栈区先创建一个元素再拷贝到vector,后者是直接在vector的尾部添加
与a[]和array不同,vector总是会初始化元素为0,当然你可以自己设置初始化数值
std::vector <double> values(20,233); //values里的所有20个元素被初始化为233
在C++17以后,同 array一样可以不说明类型直接初始化,模板会自动判断数据类型:
std::vector a{ 3.1415926 }; //equal std::vector<double> a{ 3.1415926 };
这里需要提醒以下语法的运用:
std::vector<int> a(20, 6); //声明一个大小为20的数组并全部初始为6
std::vector<int> b(20); //声明一个大小为20的数组并默认全部初始为0
std::vector<int> c{ 20 }; //声明一个大小为1的数组且20为唯一元素
vector继承了array的所有优点
1.at() 函数
2.size() 函数,是的vector也总是记录自己的大小
3.front() 和back() 函数可用于快速访问vector的首尾元素
4.可以进行大小比较
5.可以进行同类赋值,大vector赋值给小vector时,小的会被扩大以满足赋值需求,并且小的原元素会被全部覆盖
6.vector也可以被储存在其他容器中
但是vector没有fill() 函数,而是assign() 函数,使用方法:
std::vector<int> a(5); //声明一个大小为20的数组并全部默认初始为0
a.assign(10, 6); //将a扩充至10的大小,而后全部初始化为6
删除元素
从C++20开始,可以使用std::erase() 将vector里某个元素出现的所有位置抹去,比如一个vector<> a里有20个元素,那么std::erase(a,n);会将a里的所有n删去,同时将长度缩小至 20-n
当然还有clear() 函数也可以用来删除元素,但是这个函数会将vector里的所有元素删除
std::vector a{1,2,3,4,5,6};
std::erase(a, 6); //a中值为6的数据全部被删除
a.clear(); //a的所有元素都被删除
//这里应注意两者之间语法的区别,erase() 并不是vector的成员函数
vector<> 还提供了empty() 函数,但这并不是清空vector,而是判断vector是否元素为空,返回bool值,并不会修改vector
std::vector<int> a(5,2);
a.clear();
if (a.empty())
std::cout << "a is empty" << std::endl; //输出:a is empty
最后vector<>还提供了pop_back() 函数来删除vector里的最后一个元素
关于使用vector时可做的优化
vector在使用时当出现了容器大小变化时,它总是将旧的容器复制到新的更大或者更小的容器中,然后删除旧的容器,这样做会不可避免地降低程序运行效率
首先介绍一下reserve() 成员函数,它的作用是为vector预留三个元素大小的空间,但要注意的是,它与声明时初始空间大小本质上是不同的