在写C++代码时,涉及到了二维向量的定义与初始化,使用过程中有一些问题,因此,记录一下这几种方法的优缺点。
定义与遍历
// 创建一个包含n个vector<int>的二维动态数组,每个vector<int>都是空的,大小为n x 0
vector<vector<int>> g(n);
for (int i = 0; i < n; ++i) {
if (!g[i].empty()) { // 需要判断是否非空
for (int value : g[i]) {
// 具体操作
}
}
}
// 创建是一个n x n的二维数组,但所有元素的值都是未定义的
vector<vector<int>> g(n, vector<int>(n));
for (int i = 0; i < n; ++i) {
for (int j = 0; j < n; ++j) {
// 具体操作,但要注意元素的值是未初始化的
}
}
// 创建一个n x n的二维动态数组,每个元素都被初始化为-1
vector<vector<int>> g(n, vector<int>(n, -1));
for (int i = 0; i < n; ++i) {
for (int j = 0; j < n; ++j) {
// 具体=操作
}
}
优缺点
-
vector<vector<int>> g(n);
- 只分配了外部向量的内存,内部向量是空的,因此不占用额外空间;内部向量的元素是未初始化的,这可能导致未定义的行为,且需要多次分配新的内存
-
vector<vector<int>> g(n, vector<int>(n));
- 这种方法一般不用,上下两种方法的缺点都有
-
vector<vector<int>> g(n, vector<int>(n, -1));
- 符合直观感受,方便的访问任意值,但会分配更多的内存,因为内部向量也被预先分配了
- 这个特点对于一维向量
vector<int> g(n, -1);
也类似。