通过引用将数组作为C ++中的函数参数传递

时间:2012-04-28 01:15:52

标签: c++

如何传递一个数组,在main方法中通过引用声明为函数的参数?编译器也需要维度,但是当我给它们变量时,编译器会给出数组的无效整数维度错误,这里是代码:

#include <iostream>
#include <algorithm>
#include <vector>
using namespace std;

int scanV(int Row, int value, int M, int (&tableValues)[])
{
for (int i = 0; i <= M; ++i)
{
    if (tableValues[Row - 1][i] == 1)
    {
        if (i + value <= M)
        {
            tableValues[Row][i+value] == 1;
        }
        if (i - value >= 0)
        {
            tableValues[Row][i-value] = 1;
        }
    }
}
}

int main()
{
int C, B, M;
cin>>C;
int integers[C];

for (int i = 1; i < C; ++i)
{
    cin>>integers[i];
}
cin>>B;
cin>>M;
integers[0] = B;
int tableValues[C][M + 1];
tableValues[0][B] = 1;
for (int i = 1; i < C; ++i)
{
    scanV(i, integers[i], M, tableValues);
}

return 0;
}

2 个答案:

答案 0 :(得分:3)

一个简单的解决方案是使用向量。考虑这个简单的例子:

#include <iostream>
#include <vector>

void f (std::vector<std::vector<int> > &v)
{
    for (int i = 0; i < 3; ++i)
        for (int j = 0; j < 3; ++j)
            v[i][j] = i * 3 + j;
}

int main()
{
    std::vector<std::vector<int> > v (3, std::vector<int> (3, 0));
    f (v);

    for (int i = 0; i < 3; ++i)
        for (int j = 0; j < 3; ++j)
            std::cout << v[i][j] << ' ';
}

主要是创建一个int矢量(3x3)。构造函数显示3个元素,所有元素都使用int向量初始化,然后使用3个初始化为0的元素创建。

然后,通过引用函数f传递向量,函数f指定递增的值。当矢量在main中打印时,它显示:

0 1 2 3 4 5 6 7 8

正如您所看到的,它们的使用与普通数组非常相似,但它们实际上是包含的,并且使用STL可以轻松访问新级别的编程。

在C ++ 11中,它们的使用变得更加熟悉。您可以按如下方式指定向量:

std::vector<int> v0 = {2, 5};
std::vector<std::vector<int> > v1 { {1,2,3} , {4,5,6} , {7,8,9} };

请注意,对于多维度的向量,最好将其封装在某种带有基础1D向量类型的矩阵类中。

编辑:

以下是将1D和2D矢量初始化为指定元素的示例。如上所示,这在C ++ 11中很容易,但如果你已经有一个数组,它仍然很快。

int a [5] = {1,2,3,4,5}; //normal
std::vector<int> v1 (a, a +5); //create using beginning and ending addresses of a

int b[3][3] = { {1,2,3} , {4,5,6} , {7,8,9} }; //normal
std::vector<std::vector<int> > v2; //empty vector

for (int i = 0; i < 3; ++i) //3 in first dimension
    v2.push_back (std::vector<int> (b [i], b [i] + 3)); //push a vector with the appropriate 3 elements of b onto the back of v2

要一次浏览一个元素,您可以这样做:

std::vector<std::vector<int> > v (3, std::vector<int> (3));

for (int i = 0; i < v.size(); ++i) //v.size() == 3
    for (int j = 0; j < v [i].size(); ++j)
        adjustElement (v [i][j]); //replace with what you need

答案 1 :(得分:1)

std::vector是C ++的方法,因为可变长度数组(例如int integers[C];)是被禁止的。

我建议typedef这些使您的代码更易于阅读:

#include <vector>

typedef std::vector<int> row_t;
typedef std::vector<row_t> table_t;

然后你可以声明:

void scanV(int Row, int value, int M, table_t& tableValues)

我做了这个void因为它没有返回任何内容。

int main()中的变量随后变为:

row_t integers;
table_t tableValues;

注意这一行:

            tableValues[Row][i+value] == 1;

你可能想分配,而不是检查等价!

请尝试选择一些比BMC更有意义的变量名...