打印二维数组作为 C++ 中的方法
Print 2D Array as a Method in C++
我想用 C++ 编写一个打印二维数组的方法。此方法无效,它具有以下参数作为输入:二维数组、行数、列数。我想使用二维矩阵作为双指针来调用函数。我想以二维形状打印元素。我收到以下错误:
error: cannot convert ‘int (*)[2]’ to ‘int**’
编辑:将 int** list 更改为 int (*list)[2] 可行,但有没有一种方法我不必手动编写列号,因为我希望这种方法适用于不同的大小数组。
#include <iostream>
using namespace std;
void printArray2D(int** list, int row, int col) {
for (int i = 0; i < row; i++) {
for (int j = 0; j < col; j++) {
cout << list[i][j] << " ";
}
cout << endl;
}
}
int main()
{
int list1[2][2] = { {1,2},{3,4} };
int row1 = sizeof(list1) / sizeof(list1[0]);
int col1 = sizeof(list1[0]) / sizeof(list1[0][0]);
printArray2D(list1, row1, col1);
return 0;
}
您的数组实际上是扁平的,这意味着您必须将其类型转换为 int*
,而不是 int**
。 int**
指的是指向 int 数组的指针数组,但数组中没有指针。
换句话说,您实际上拥有一维整数数组(平面)。任何 C 多维数组,如 int a[3][5]
或 int a[3][5][7]
都是平面数组,本质上是一维的。 [3][5]
数组指向内存中包含 3 * 5 = 15
个整数的连续区域,[3][5][7]
数组指向内存中连续区域中的 3 * 5 * 7 = 105
个整数。
此外,转换为 int*
后,有关维度的信息也会丢失,因此您必须通过使用 [i * col + j]
:
手动进行索引算法
#include <iostream>
using namespace std;
void printArray2D(int* list, int row, int col) {
for (int i = 0; i < row; i++) {
for (int j = 0; j < col; j++) {
cout << list[i * col + j] << " ";
}
cout << endl;
}
}
int main()
{
int list1[2][2] = { {1,2},{3,4} };
int row1 = sizeof(list1) / sizeof(list1[0]);
int col1 = sizeof(list1[0]) / sizeof(list1[0][0]);
printArray2D((int*)list1, row1, col1);
return 0;
}
输出:
1 2
3 4
实际上有一个使用模板的 C++ 特定解决方案,可用于保留有关维度的信息并将此信息转发给函数,那么您不必使用手动索引算法:
#include <iostream>
using namespace std;
template <int Rows, int Cols>
void printArray2D(int const (&list)[Rows][Cols]) {
for (int i = 0; i < Rows; i++) {
for (int j = 0; j < Cols; j++) {
cout << list[i][j] << " ";
}
cout << endl;
}
}
int main()
{
int list1[2][2] = { {1,2},{3,4} };
int row1 = sizeof(list1) / sizeof(list1[0]);
int col1 = sizeof(list1[0]) / sizeof(list1[0][0]);
printArray2D(list1);
return 0;
}
输出:
1 2
3 4
如果您有固定的多维数组,另一个不错的解决方案是使用 std::array。然后你不需要转发任何尺寸信息,只需使用 std::array
:
的 .size()
方法
#include <iostream>
#include <array>
template <typename ArrT>
void printArray2D(ArrT const & list) {
for (int i = 0; i < list.size(); i++) {
for (int j = 0; j < list[i].size(); j++) {
std::cout << list[i][j] << " ";
}
std::cout << std::endl;
}
}
int main()
{
std::array<std::array<int, 2>, 2> list1 =
{ std::array{1,2}, std::array{3,4} };
printArray2D(list1);
return 0;
}
输出:
1 2
3 4
我想用 C++ 编写一个打印二维数组的方法。此方法无效,它具有以下参数作为输入:二维数组、行数、列数。我想使用二维矩阵作为双指针来调用函数。我想以二维形状打印元素。我收到以下错误:
error: cannot convert ‘int (*)[2]’ to ‘int**’
编辑:将 int** list 更改为 int (*list)[2] 可行,但有没有一种方法我不必手动编写列号,因为我希望这种方法适用于不同的大小数组。
#include <iostream>
using namespace std;
void printArray2D(int** list, int row, int col) {
for (int i = 0; i < row; i++) {
for (int j = 0; j < col; j++) {
cout << list[i][j] << " ";
}
cout << endl;
}
}
int main()
{
int list1[2][2] = { {1,2},{3,4} };
int row1 = sizeof(list1) / sizeof(list1[0]);
int col1 = sizeof(list1[0]) / sizeof(list1[0][0]);
printArray2D(list1, row1, col1);
return 0;
}
您的数组实际上是扁平的,这意味着您必须将其类型转换为 int*
,而不是 int**
。 int**
指的是指向 int 数组的指针数组,但数组中没有指针。
换句话说,您实际上拥有一维整数数组(平面)。任何 C 多维数组,如 int a[3][5]
或 int a[3][5][7]
都是平面数组,本质上是一维的。 [3][5]
数组指向内存中包含 3 * 5 = 15
个整数的连续区域,[3][5][7]
数组指向内存中连续区域中的 3 * 5 * 7 = 105
个整数。
此外,转换为 int*
后,有关维度的信息也会丢失,因此您必须通过使用 [i * col + j]
:
#include <iostream>
using namespace std;
void printArray2D(int* list, int row, int col) {
for (int i = 0; i < row; i++) {
for (int j = 0; j < col; j++) {
cout << list[i * col + j] << " ";
}
cout << endl;
}
}
int main()
{
int list1[2][2] = { {1,2},{3,4} };
int row1 = sizeof(list1) / sizeof(list1[0]);
int col1 = sizeof(list1[0]) / sizeof(list1[0][0]);
printArray2D((int*)list1, row1, col1);
return 0;
}
输出:
1 2
3 4
实际上有一个使用模板的 C++ 特定解决方案,可用于保留有关维度的信息并将此信息转发给函数,那么您不必使用手动索引算法:
#include <iostream>
using namespace std;
template <int Rows, int Cols>
void printArray2D(int const (&list)[Rows][Cols]) {
for (int i = 0; i < Rows; i++) {
for (int j = 0; j < Cols; j++) {
cout << list[i][j] << " ";
}
cout << endl;
}
}
int main()
{
int list1[2][2] = { {1,2},{3,4} };
int row1 = sizeof(list1) / sizeof(list1[0]);
int col1 = sizeof(list1[0]) / sizeof(list1[0][0]);
printArray2D(list1);
return 0;
}
输出:
1 2
3 4
如果您有固定的多维数组,另一个不错的解决方案是使用 std::array。然后你不需要转发任何尺寸信息,只需使用 std::array
:
.size()
方法
#include <iostream>
#include <array>
template <typename ArrT>
void printArray2D(ArrT const & list) {
for (int i = 0; i < list.size(); i++) {
for (int j = 0; j < list[i].size(); j++) {
std::cout << list[i][j] << " ";
}
std::cout << std::endl;
}
}
int main()
{
std::array<std::array<int, 2>, 2> list1 =
{ std::array{1,2}, std::array{3,4} };
printArray2D(list1);
return 0;
}
输出:
1 2
3 4