一、vector概述
vector 是 c++ 标准库中的一个动态数组容器,可以动态的增删元素。vector 内部维护着一块连续的内存,动态增加或者删去元素时,vector会重新分配一块连续的内存空间,将数据拷贝到新的内存中,并且释放旧内存。vector 就像一个可以改变大小的数组,它可以存储任意的数据类型,而且支持随机访问。在使用 vector 时,需要注意避免大量的插入或删除元素的操作,因为它会频繁的进行内存分配和释放,造成性能上的浪费。
二、一维vector的初始化
在介绍二维vector的初始化之前,先来看一下常见的一维vector的初始化方式。
#include <vector>
using namespace std;
int main(){
// 1. 初始化为指定大小,初始值为默认值 0
vector<int> v1(5);
// {0, 0, 0, 0, 0}
// 2. 初始化为指定大小,初始值为指定值
vector<int> v2(5, 1);
// {1, 1, 1, 1, 1}
// 3. 初始化为指定数组的区间
int a[] = {1, 2, 3, 4, 5};
vector<int> v3(a, a + 5); // v3.size() == 5,v3包含数组a中的5个元素
// {1, 2, 3, 4, 5}
// 4. 初始化为另一个vector的区间
vector<int> v4(v2.begin(), v2.begin() + 3);
// {1, 1, 1}
return 0;
}
三、二维vector的初始化
1. 初始化为指定大小
二维vector初始化为指定大小时,需要指定行数和列数,语法为:vector<vector<类型>> vec(行数, vector<类型>(列数, 初始值))。
#include <vector>
using namespace std;
int main(){
// 1. 初始化为指定大小,初始值为默认值 0
vector<vector<int>> vec1(3, vector<int>(4));
// {{0, 0, 0, 0}, {0, 0, 0, 0}, {0, 0, 0, 0}}
// 2. 初始化为指定大小,初始值为指定值
vector<vector<int>> vec2(3, vector<int>(4, 1));
// {{1, 1, 1, 1}, {1, 1, 1, 1}, {1, 1, 1, 1}}
return 0;
}
2. 初始化为指定值
二维vector初始化为指定值时,需要指定所需行数和列数,但指定的初始值是相同的。语法为:vector<vector<类型>> vec(行数, vector<类型>(列数, 初始值))。
#include <vector>
using namespace std;
int main(){
// 1. 初始化为指定值
vector<vector<int>> vec1(3, vector<int>(4, 1));
// {{1, 1, 1, 1}, {1, 1, 1, 1}, {1, 1, 1, 1}}
return 0;
}
3. 不预先分配大小
可以在需要时进行分配,先初始化行数,再给每一行初始化列数。需要注意,分配空间之后,可以通过下标直接赋值,但如果需要添加新的行或者列,需要通过 push_back() 函数添加。
#include <vector>
#include <iostream>
using namespace std;
int row, col;
vector<vector<int>> vec;
int main(){
// 1. 不预先分配大小
cin >> row >> col;
vec.resize(row); // 初始化行数
for(int i = 0; i < row; i++){
vec[i].resize(col); // 给每一行初始化列数
for(int j = 0; j < col; j++){
cin >> vec[i][j]; // 通过下标直接赋值
}
}
// 2. 进行输出以验证
for(int i = 0; i < row; i++){
for(int j = 0; j < col; j++){
cout << vec[i][j] << " ";
}
cout << endl;
}
return 0;
}
四、动态二维vector操作
如果要在二维vector中动态添加或删除行或列,则需要使用 push_back() 或者 erase() 函数进行操作。
1. 添加行
使用 push_back() 函数可以添加新的行,语法为:vector.push_back(vector<类型>(列数, 初始值))。
#include <vector>
#include <iostream>
using namespace std;
int main(){
vector<vector<int>> vec(2, vector<int>(3, 1));
// {{1, 1, 1}, {1, 1, 1}}
// 添加一行
vec.push_back(vector<int>(3, 2));
// {{1, 1, 1}, {1, 1, 1}, {2, 2, 2}}
return 0;
}
2. 删除行
使用 erase() 函数可以删除行,语法为:vector.erase(ite)。
#include <vector>
#include <iostream>
using namespace std;
int main(){
vector<vector<int>> vec(3, vector<int>(3, 1));
// {{1, 1, 1}, {1, 1, 1}, {1, 1, 1}}
// 删除第二行,需要注意,删除操作会使被删元素所占用的内存被释放
vec.erase(vec.begin() + 1);
// {{1, 1, 1}, {1, 1, 1}}
return 0;
}
3. 添加列
添加新的列需要分别对每一行进行操作,使用 push_back() 函数添加新元素。
#include <vector>
#include <iostream>
using namespace std;
int main(){
vector<vector<int>> vec(2, vector<int>(2, 1));
// {{1, 1}, {1, 1}}
// 添加一列
for(int i = 0; i < vec.size(); i++){
vec[i].push_back(2);
}
// {{1, 1, 2}, {1, 1, 2}}
return 0;
}
4. 删除列
删除列同样需要分别对每一行进行操作,使用 erase() 函数删除元素。
#include <vector>
#include <iostream>
using namespace std;
int main(){
vector<vector<int>> vec(2, vector<int>(3, 1));
// {{1, 1, 1}, {1, 1, 1}}
// 删除第二列
for(int i = 0; i < vec.size(); i++){
vec[i].erase(vec[i].begin() + 1);
}
// {{1, 1}, {1, 1}}
return 0;
}
总结
使用 vector 作为二维数组来存储数据,可以在代码实现中动态分配和释放内存,非常灵活。但是,如果频繁的进行添加或删除元素的操作,会严重影响程序的运行效率。为了提高程序的效率,在使用二维vector时,需要根据实际情况选择合适的初始化方式,尽可能的减少对数组大小的改动,从而降低内存管理的成本,提高程序的性能。