1

如何通过引用将在 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;
}
4

2 回答 2

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] << ' ';
}

主要是创建整数 (3x3) 的 2D 向量。构造函数显示了 3 个元素,所有元素都使用 int 向量进行初始化,而这些元素又使用初始化为 0 的 3 个元素创建。

然后,该向量通过引用传递给函数 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} };

请注意,对于多维向量,最好将其封装在某种矩阵类中,并使用底层的一维向量类型。

编辑:

这是将一维和二维向量初始化为指定元素的示例。如上所示,这在 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
于 2012-04-28T01:33:51.997 回答
1

std::vectorint integers[C];s 是 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;

您可能打算分配,而不是检查等价性!

请尝试选择一些比B, M, C...更有意义的变量名

于 2012-04-28T02:36:27.960 回答