本文已参与「新人创作礼」活动,一起开启掘金创作之路。
C++ 一个很头疼的事情就是只能返回一个值,想要返回多个值只能将这些值存在数组中,返回一个数组或者vector。
1、返回二维数组:
#include <iostream>
using namespace std;
int **func(int row,int col)
int **data = 0; //初始化一个二维数组
data = new int*[row]; //建立包含row个指针的指针数组
for (int i = 0; i < row; i++)
*(data + i) = new int[col]; //每个一维指针数组的长度都是col
for (int i = 0; i < row; i++)
for (int j = 0; j < col; j++)
data[i][j] = i + j; //随便定义元素
return data;
int main()
int row = 5;
int col = 8;
int **data = func(row, col);
for (int i = 0; i < row; i++)
for (int j = 0; j < col; j++)
if (j < col - 1)
cout << data[i][j] << "\t";
cout << data[i][j] << endl;
return 0;
0 1 2 3 4 5 6 7
1 2 3 4 5 6 7 8
2 3 4 5 6 7 8 9
3 4 5 6 7 8 9 10
4 5 6 7 8 9 10 11
其实这样用指针并不好,容易出现空指针、越界等问题。
2、返回 vector<vector>
vector是一个类模板而非类型,vector、vector<vector>等才是类型。
关于二维vector的元素插入方式可参考博客:关于C++中vector<vector >的使用
使用vector时一定要注意容量和下标的问题,尤其要用下标赋值时,要先确定vector是否为空以及容量是否足够。最安全的方法是组合使用 v.push_back() 、v.pop_back() 和 v.clear()
code:
#include <iostream>
#include <vector>
using namespace std;
vector<vector<int>> func(int row,int col)
vector<vector<int>> data; //二维vector
vector<int> data_row(col); //存放每行数据的一维vector
for(int i=0;i<row;i++)
for(int j=0;j<col;j++)
data_row[j]=i+j; //使用下标对vector赋值时要注意vector容量是否足够
data.push_back(data_row);
return data;
int main()
int row = 5;
int col = 8;
vector<vector<int>> data = func(row, col);
for (int i = 0; i < row; i++)
for (int j = 0; j < col; j++)
if (j < col - 1)
cout << data[i][j] << "\t";
cout << data[i][j] << endl;
return 0;
0 1 2 3 4 5 6 7
1 2 3 4 5 6 7 8
2 3 4 5 6 7 8 9
3 4 5 6 7 8 9 10
4 5 6 7 8 9 10 11
3、二维数组 vs 二维vector
3.1 二维数组
因为C++规定多维数组初始化时一定要给出列数,行数可以缺省,所以二维数组中每个子数组的元素数量一定相同。如果初始化时数量不相同,则用默认值补全。
#include <iostream>
using namespace std;
int main()
int data[][5] = {{1,2,3},
{4,5,6,7},
{8,9,10,11,12}};
for(auto &row:data) //注意这里是引用 &row,因为row是个指针
for(auto col:row)
cout<<col<<'\t';
cout<<endl;
return 0;
1 2 3 0 0
4 5 6 7 0
8 9 10 11 12
可以发现,每行元素数量必须相同。但在实际应用中,多维数组中的每个子数组元素数量并不一定相同,因此数组就显得不那么人性化了,这种情况就可以考虑使用二维 vector。
上面的例子用了C++11的新语法:范围for循环。要注意使用范围for循环对二维数组进行迭代时,第一层循环的 row 要用引用,因为 row 不是普通的数组元素,而是子数组首元素的指针。
3.2 二维 vector : vector<vector>
二维 vector 中,每个子vector 的长度可以不相同。如以下例子:
#include <iostream>
#include <vector>
using namespace std;
int main()
vector<vector<int>> data = {{1,2,3},
{4,5,6,7},
{8,9,10,11,12}};
for(auto row:data)
for(auto col:row)
cout<<col<<'\t';
cout<<endl;
cout<<"每个子vector的长度:"<<endl;
for(auto row:data)
cout<<row.size()<<'\t';
return 0;
1 2 3
4 5 6 7
8 9 10 11 12
每个子vector的长度:
3 4 5
复制代码