如何传递一个数组,在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;
}
答案 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;
你可能想分配,而不是检查等价!
请尝试选择一些比B
,M
,C
更有意义的变量名...