C++的二维vector和C的二维数组学习

发布时间:2026/7/25 1:19:16
C++的二维vector和C的二维数组学习 C的二维vector和C的二维数组学习参考了http://blog.csdn.net/zhuqinglu/article/details/1805050可通过下列代码直接创建m*n的二维vectorvectorvector int ivec(m ,vectorint(n)); //m*n的二维vector动态创建m*n的二维vector方法一vectorvector int ivec;ivec.resize(m);for(int i0;im;i) ivec[i].resize(n);方法二vectorvector int ivec;ivec.resize(m,vectorint(n));动态创建二维数组a[m][n]C语言版创建代码#includemalloc.h int **a(int **)malloc(m*sizeof(int *)); for(int i0;im;i) a[i](int *)malloc(n*sizeof(int));释放代码for (i0;im;i) { free(data[i]); } free(data);C版创建代码:int **anew int*[m]; for(int i0;im;i) a[i]new int[n];释放代码for(int i 0; i ! m; i) { delete[] p[i]; } delete[] p;初始化二维数组int a[2][2] {{1,2},{3,4}};初始化二维vector:如果全初始化为0vectorvector int ivec(m ,vectorint(n,0)); //m*n的二维vector所有元素为0也可以用vectorvectorint A; A.resize(m, vectorint(n, 0));注意上例中n固定。但二维vector的第二维的size()并不一定要是常数如下例中的三个vector组成的二维vector其大小分别为123。这一点跟C的二维数组不一样。vectorvectorint vecSet; for(int i 1; i 3; i) vecSet.push_back(vectorint(i,0));如果初始化为不同值vectorvectorint a {{1,2}, {3,4}};注意与上面的C的二维数组区别这里a的后面加不加号都可以。如果C的class里面定义了vector可以在class的constructor里面初始化比如class Myclass { public: Myclass(int m_size): v1(my_size,0), v2(m_size, 0){} ... private: vectorint v1, v2; }如果想遍历二维vector(按vector一个一个来)可以用C 11的auto比如#include iostream #include vector using namespace std; int main() { vectorvectorint v {{1,2}, {3,4}}; for (const auto inner : v) { for (const auto item : inner) { cout item ; } } cout endl; return 0; }定义一个二维数组第一维有26个但第二维不定。vectorvectorint vecs(26, vectorint());三维vector怎么定义呢 一个例子如下vectorvectorvectorbool dp (n, vectorvectorbool (n, vectorbool(n 1, false)));另一个三维vector的初始化例子:vectorvectorvectorint dp(len 1, vectorvectorint(k 1, vectorint(target 1, 0)));二维vector的初始化如下:假设已经有vectorvectorbool board;vectorvectorbool mask(board.size(), vectorbool(board[0].size(), true));下面是一些关于C/C 二维数组初始化的资料引用自C语言二维数组的定义、初始化、赋值二维数组的初始化赋值二维数组的初始化可以按行分段赋值也可按行连续赋值。例如对于数组 a[5][3]按行分段赋值应该写作int a[5][3]{ {80,75,92}, {61,65,71}, {59,63,70}, {85,87,90}, {76,77,85} };按行连续赋值应该写作int a[5][3]{80, 75, 92, 61, 65, 71, 59, 63, 70, 85, 87, 90, 76, 77, 85};这两种赋初值的结果是完全相同的。对于二维数组的初始化还要注意以下几点1) 可以只对部分元素赋值未赋值的元素自动取“零”值。例如int a[3][3] {{1}, {2}, {3}};是对每一行的第一列元素赋值未赋值的元素的值为 0。赋值后各元素的值为1 0 02 0 03 0 0再如int a[3][3] {{0,1}, {0,0,2}, {3}};赋值后各元素的值为0 1 00 0 23 0 02) 如果对全部元素赋值那么第一维的长度可以不给出。例如int a[3][3] {1, 2, 3, 4, 5, 6, 7, 8, 9};可以写为int a[][3] {1, 2, 3, 4, 5, 6, 7, 8, 9};3) 二维数组可以看作是由一维数组嵌套而成的如果一个数组的每个元素又是一个数组那么它就是二维数组。当然前提是各个元素的类型必须相同。根据这样的分析一个二维数组也可以分解为多个一维数组C语言允许这种分解。例如二维数组a[3][4]可分解为三个一维数组它们的数组名分别为 a[0]、a[1]、a[2]。这三个一维数组可以直接拿来使用。这三个一维数组都有 4 个元素比如一维数组 a[0] 的元素为 a[0][0]、a[0][1]、a[0][2]、a[0][3]。如果要返回一个二维空vector可以用return vectorvectorint();好像也可以用return {{}};下面内容参考链接https://blog.csdn.net/shizheng_Li/article/details/105862560圆括号vectorint v(n)圆括号是构造函数表示1个容量为n的vector方括号vectorint v[n] :表示n个vector v 二维数组相当于 vectorvectorint v(n)二维数组举例vector v(10) 表示 一个容量10的vectorvector v[10] 表示10个容量不确定的vector组成的二维数组//////////////////二维数组斜向遍历假设二维数组的大小 \(n 4\)当 \(l\) 从 2 递增到 4 时遍历的区间 \([i, j]\) 顺序如下\(l 2\)长度为 2 的斜线即紧邻主对角线的上方\(i 0 \rightarrow [0, 1]\)\(i 1 \rightarrow [1, 2]\)\(i 2 \rightarrow [2, 3]\)\(l 3\)长度为 3 的斜线\(i 0 \rightarrow [0, 2]\)\(i 1 \rightarrow [1, 3]\)\(l 4\)长度为 4 的斜线\(i 0 \rightarrow [0, 3]\)每次外层循环 \(l\) 增加时实际上是在遍历平行于主对角线的右上方的另一条斜线。// 斜着遍历数组for (let l 2; l n; l) {for (let i 0; i n - l; i) {let j l i - 1;// 计算 dp[i][j]}}