Vector介绍
定义
在C++中,vector是一种动态数组,可以在运行期间根据需求自动扩展或缩小。使用vector的第一步需要包含头文件#include<vector>
。
可以采用以下方式声明一个vector变量:
vector<int> vec; // 声明一个int型的vector变量vec
这将创建名为vec
的vector对象,其元素类型为int
。
成员函数
vector类提供了许多成员函数用于操作元素,包括:
push_back()
:向vector末尾添加元素;pop_back()
:删除vector末尾的元素;size()
:返回vector中元素的数量;clear()
:清空vector中的所有元素;begin()
和end()
:返回指向vector开头和结尾的迭代器,可以使用这些迭代器对vector进行循环遍历等操作;insert()
:在vector的指定位置插入元素;erase()
:删除vector的元素;at()
:访问vector指定位置的元素。front()
和back()
:分别返回vector中第一个和最后一个元素的引用;reserve()
:分配内存以容纳指定数量的元素,但并不改变vector的大小,可以提高插入操作的效率;shrink_to_fit()
:释放vector占用的多余存储空间;assign()
:将vector中的元素替换为新的元素;swap()
:交换两个vector的内容;emplace()
:在vector的指定位置插入元素,避免了先构造对象再拷贝的过程。
实例应用
例一
#include <iostream>
#include <vector>
using namespace std;
int main()
{
vector<int> vec1(5, 3); // 创建一个包含5个值为3的int类型的向量
vector<int> vec2; // 创建一个空的向量
// 判断向量是否为空
if(vec1.empty()){
cout << "vec1为空" << endl;
}else{
cout << "vec1不为空" << endl;
}
// 访问向量中的元素
cout << "vec1中的元素为:";
for(int i = 0; i < vec1.size(); ++i){
cout << vec1[i] << " ";
}
cout << endl;
// 修改向量中的元素
vec1[2] = 5;
cout << "修改后vec1中的元素为:";
for(vector<int>::iterator iter = vec1.begin(); iter != vec1.end(); ++iter){
cout << *iter << " ";
}
cout << endl;
// 在向量的末尾添加元素
for(int i = 0; i < 3; ++i){
vec2.push_back(i + 1);
}
// 将vec1赋值给vec2
vec2.assign(vec1.begin(), vec1.end());
cout << "vec2中的元素为:";
for(vector<int>::iterator iter = vec2.begin(); iter != vec2.end(); ++iter){
cout << *iter << " ";
}
cout << endl;
// 交换vec1和vec2
vec1.swap(vec2);
cout << "交换后的vec1中的元素为:";
for(vector<int>::iterator iter = vec1.begin(); iter != vec1.end(); ++iter){
cout << *iter << " ";
}
cout << endl;
// 在vec1的第二个位置插入元素
vec1.emplace(vec1.begin() + 1, 10);
// 输出修改后的vec1
cout << "修改后的vec1中的元素为:";
for(vector<int>::iterator iter = vec1.begin(); iter != vec1.end(); ++iter){
cout << *iter << " ";
}
cout << endl;
// 分配存储空间
vec1.reserve(10);
// 收缩存储空间
vec1.shrink_to_fit();
return 0;
}
运行结果:
vec1不为空
vec1中的元素为:3 3 3 3 3
修改后vec1中的元素为:3 3 5 3 3
vec2中的元素为:3 3 5 3 3
交换后的vec1中的元素为:3 3 5 3 3
修改后的vec1中的元素为:3 10 3 5 3 3
例子中发现输出方式的书写有点麻烦
for(vector<int>::iterator iter = vec1.begin(); iter != vec1.end(); ++iter){
cout << *iter << " ";
}
这种写起来特别费力,可以进行优化简写
for (auto x : vec1) {
cout << x << " ";
}//使用范围for循环来遍历vector中的元素,
//这样也可以省略迭代器的定义和循环条件,代码更加简短:
因此代码可以优化为:
#include <iostream>
#include <vector>
using namespace std;
int main()
{
vector<int> vec1(5, 3); // 创建一个包含5个值为3的int类型的向量
vector<int> vec2; // 创建一个空的向量
// 判断向量是否为空
if(vec1.empty()){
cout << "vec1为空" << endl;
}else{
cout << "vec1不为空" << endl;
}
// 访问向量中的元素
cout << "vec1中的元素为:";
for (auto x : vec1) {
cout << x << " ";
}
cout << endl;
// 修改向量中的元素
vec1[2] = 5;
cout << "修改后vec1中的元素为:";
for (auto x : vec1) {
cout << x << " ";
}
cout << endl;
// 在向量的末尾添加元素
for (auto x : vec2) {
cout << x << " ";
}
// 将vec1赋值给vec2
vec2.assign(vec1.begin(), vec1.end());
cout << "vec2中的元素为:";
for (auto x : vec2) {
cout << x << " ";
}
cout << endl;
// 交换vec1和vec2
vec1.swap(vec2);
cout << "交换后的vec1中的元素为:";
for (auto x : vec1) {
cout << x << " ";
}
cout << endl;
// 在vec1的第二个位置插入元素
vec1.emplace(vec1.begin() + 1, 10);
// 输出修改后的vec1
cout << "修改后的vec1中的元素为:";
for (auto x : vec1) {
cout << x << " ";
}
cout << endl;
// 分配存储空间
vec1.reserve(10);
// 收缩存储空间
vec1.shrink_to_fit();
return 0;
}
运行结果是一样的
例二
#include <iostream>
#include <vector>
using namespace std;
int main()
{
vector<int> vec; // 创建一个vector对象
// 向vector添加元素
vec.push_back(1);
vec.push_back(2);
vec.push_back(3);
vec.push_back(4);
// 访问vector中的元素
cout << "vector中的元素为:";
for(int i = 0; i < vec.size(); ++i){
cout << vec[i] << " ";
}
cout << endl;
// 在vector中插入元素
vec.insert(vec.begin() + 2, 5);
// 删除vector中的元素
vec.erase(vec.begin() + 3);
// 使用迭代器输出vector中的元素
cout << "修改后的vector中的元素为:";
for(vector<int>::iterator iter = vec.begin(); iter != vec.end(); ++iter){
cout << *iter << " ";
}
cout << endl;
// 清空vector中的元素
vec.clear();
// 判断vector是否为空
if(vec.empty()){
cout << "vector为空" << endl;
}else{
cout << "vector不为空" << endl;
}
return 0;
}
运行结果:
vector中的元素为:1 2 3 4
修改后的vector中的元素为:1 2 5 4
vector为空
vector的使用方法有时间值得反复复习
同时使用下面这样的代码更加直观、容易理解,在处理简单的vector遍历任务时特别有用。
for (auto x : vec1) {
cout << x << " ";
}
同时还有另一种较为麻烦,但比最初的简化一点的方式
for (auto iter = vec1.begin(); iter != vec1.end(); ++iter) {
cout << *iter << " ";
}