本文已参与「新人创作礼」活动,一起开启掘金创作之路。

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
复制代码
  • 私信