是否可以编写一个可以采用n维数组的函数?

时间:2014-09-19 19:38:38

标签: c++ c

我正在尝试编写一个函数,该函数可以成功获取数组中的任何维度和打印值。但我无法前进,因为我们必须在声明函数时声明除最左边的所有维度。我们是否有可能编写一个可以将数组作为任何维度的输入的通用函数?

例如,该函数应该能够采用二维数组或三维数组或n维数组,其中n是任意数。

5 个答案:

答案 0 :(得分:11)

对每个维度和模板使用递归(所以在C ++中),以下内容可能有所帮助:

template <typename T>
void print(const T&e)
{
    std::cout << e << " ";
}

template <typename T, std::size_t N>
void print(const T (&a)[N])
{
    std::cout << "{";
    for (const auto& e : a) {
        print(e);
    }
    std::cout << "}" << std::endl;
}

使用示例:

int a[2][3][4];
print(a);

Live example

答案 1 :(得分:3)

如果您将数组编码为一维,然后自己计算单个索引,那么您当然可以使程序看起来好像数组是针对可变数量的维度而制作的。

我的首要问题是如何做到这一点,首先是一个包含你打算使用的每个维度范围的向量。

该向量中的元素数量是您拥有的维度数。

答案 2 :(得分:3)

将数组作为指向数组元素类型的指针传递给函数,而不管数组的维数。您可以使用其他参数来指定维数n和一个长度为n的数组(另一个),指定每个维度中的元素数。请注意,[]表示法只是执行指针添加的一种整洁方式。

答案 3 :(得分:3)

如果要访问特定元素或对数组进行操作,但是如果要动态创建矩阵,可以使用指针通过传递print函数中的维度来访问每个元素。

因为如果你有一个多维数组定义为int [][],那么 x = y[a][b]相当于x = *((int *)y + a * NUMBER_OF_COLUMNS + b);

查看此帖子了解详情:How to use pointer expressions to access elements of a two-dimensional array in C?

因此,如果您想打印整个矩阵或访问任何特定元素,您可以这样做:

#include <iostream>
using namespace std;

//the function print_2D_matrix receives 4 arguments: pointer to first element
//                                                   dimension of array arr, i.e. n x m
//                                                   index of the element to be printed, i.e. a and b
void print_2D_matrix(int *arr, int n, int m, int a, int b){
    for(int i = 0; i < n; i++){
        for(int j = 0; j < m; j++)
            printf("%d ", *(arr + (i * m) + j));
        printf("\n");
    }
    //go to the address just before a row, i.e. (a - 1) * NO_OF_COLUMNS 
    //then go to the address on b column, i.e. (a - 1) * NO_OF_COLUMNS + b
    //since we started from the base address, i.e. first element( arr[0][0] ), subtract 1 
    printf("arr[3][3] = %d\n", *(arr + ((a - 1) * m) + b - 1));    //print arr[a][b]
} 

int main() {
    int n, m;
    cin>>n>>m;
    int arr[n][m];

    for(int i = 0; i < n; i++)    //initialize the matrix
        for(int j = 0; j < m; j++)
            arr[i][j] = i * j;

    print_2D_matrix((int *) arr, n, m, 3, 3);

    return 0;
}

上述程序的输出(n x m = 4 x 5)为:

0 0 0 0 0
0 1 2 3 4
0 2 4 6 8
0 3 6 9 12
arr[3][3] = 4

答案 4 :(得分:0)

我确信这违反了C标准的至少一条规则,但它应该在实践中有效。请注意,它使用0作为数组任何级别的终止元素的标记值。

void print(void* p, int dim)
{
    if (dim == 1)
    {
        int* a = (int*) p;
        while (*a)
        {
            printf("%d ", *a++);
        }
        printf("\n");
    }
    else
    {
        void** a = (void**)p;
        while (*a)
        {
            print(*a++, dim - 1);
        }
    }
}

void test()
{
    int x0 [] = { 11, 12, 13, 14, 15, 0 };
    int x1 [] = { 21, 22, 23, 0 };
    int x2 [] = { 0 };
    int x3 [] = { 41, 42, 0 };
    int x4 [] = { 51, 52, 53, 0 };
    int* y0 [] = { x0, x3, 0 };
    int* y1 [] = { 0 };
    int* y2 [] = { x1, x2, x4, 0 };
    int** z [] = { y0, y1, y2, 0 };

    print(z, 3);
}

打印:

11 12 13 14 15
41 42
21 22 23

51 52 53