有没有办法从函数全局声明一个可变大小的向量?
Is there a way to declare a variable sized vector globally from a function?
#include <bits/stdc++.h>
using namespace std;
int grid(int x, int y)
{
static vector<vector<int>> vec(x + 1, vector<int>(y + 1, 0));
if (vec[x][y] != 0)
return vec[x][y];
if (x == 0 || y == 0)
return 0;
if (x == 1 && y == 1)
return 1;
vec[x][y] = grid(x - 1, y) + grid(x, y - 1);
return vec[x][y];
}
int main()
{
int x, y;
cin >> x >> y;
cout << grid(x, y);
return 0;
}
我在 grid 函数中用向量大小作为参数初始化了一个二维向量“vec”。如果我在其他一些函数中需要“vec”,我将如何使用它而不将其作为参数传递?
我无法全局初始化向量,因为它的大小可变。
当向量的大小取决于用户输入时,您显然无法创建全局向量。但是您可以调整现有矢量的大小。
vector<vector<int>> vec; // create at zero size
int grid(int x, int y)
{
vec.resize(x + 1, vector<int>(y + 1, 0)); // resize to required size
...
您正在使用 c++ 而非 c 进行开发。您可以使用 class 来实现这一点。
看起来像:
using namespace std;
class grid
{
public:
grid(int x, int y)
{
mGrid = std::vector<std::vector<int>>(x + 1, vector<int>(y + 1, 0));
}
int getValue(int x, int y)
{
return vec[x][y];
}
private:
std::vector<std::vector<int>> mGrid;
};
int main()
{
int x, y;
cin >> x >> y;
grid myGrid(x, y);
cout << myGrid.getValue(x, y);
return 0;
}
并且您在 class 中创建的每个方法都可以访问这个名为 mGrid 的成员。
否则,如果您不能使用 class,您可以创建全局矢量并在网格方法期间更改它:
using namespace std;
vector<vector<int>> vec;
int grid(int x, int y)
{
vec(x + 1, vector<int>(y + 1, 0));
if (vec[x][y] != 0)
return vec[x][y];
if (x == 0 || y == 0)
return 0;
if (x == 1 && y == 1)
return 1;
vec.resize(x + 1, vector<int>(y + 1, 0));
return vec[x][y];
}
int main()
{
int x, y;
cin >> x >> y;
cout << grid(x, y);
return 0;
}
记得添加错误处理或异常以避免核心转储:)
#include <bits/stdc++.h>
using namespace std;
int grid(int x, int y)
{
static vector<vector<int>> vec(x + 1, vector<int>(y + 1, 0));
if (vec[x][y] != 0)
return vec[x][y];
if (x == 0 || y == 0)
return 0;
if (x == 1 && y == 1)
return 1;
vec[x][y] = grid(x - 1, y) + grid(x, y - 1);
return vec[x][y];
}
int main()
{
int x, y;
cin >> x >> y;
cout << grid(x, y);
return 0;
}
我在 grid 函数中用向量大小作为参数初始化了一个二维向量“vec”。如果我在其他一些函数中需要“vec”,我将如何使用它而不将其作为参数传递?
我无法全局初始化向量,因为它的大小可变。
当向量的大小取决于用户输入时,您显然无法创建全局向量。但是您可以调整现有矢量的大小。
vector<vector<int>> vec; // create at zero size
int grid(int x, int y)
{
vec.resize(x + 1, vector<int>(y + 1, 0)); // resize to required size
...
您正在使用 c++ 而非 c 进行开发。您可以使用 class 来实现这一点。
看起来像:
using namespace std;
class grid
{
public:
grid(int x, int y)
{
mGrid = std::vector<std::vector<int>>(x + 1, vector<int>(y + 1, 0));
}
int getValue(int x, int y)
{
return vec[x][y];
}
private:
std::vector<std::vector<int>> mGrid;
};
int main()
{
int x, y;
cin >> x >> y;
grid myGrid(x, y);
cout << myGrid.getValue(x, y);
return 0;
}
并且您在 class 中创建的每个方法都可以访问这个名为 mGrid 的成员。
否则,如果您不能使用 class,您可以创建全局矢量并在网格方法期间更改它:
using namespace std;
vector<vector<int>> vec;
int grid(int x, int y)
{
vec(x + 1, vector<int>(y + 1, 0));
if (vec[x][y] != 0)
return vec[x][y];
if (x == 0 || y == 0)
return 0;
if (x == 1 && y == 1)
return 1;
vec.resize(x + 1, vector<int>(y + 1, 0));
return vec[x][y];
}
int main()
{
int x, y;
cin >> x >> y;
cout << grid(x, y);
return 0;
}
记得添加错误处理或异常以避免核心转储:)