一、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時,需要根據實際情況選擇合適的初始化方式,儘可能的減少對數組大小的改動,從而降低內存管理的成本,提高程序的性能。
原創文章,作者:DDEWE,如若轉載,請註明出處:https://www.506064.com/zh-tw/n/335009.html