如何将静态数组初始化为 C++ 函数中的某个值?
Posted
技术标签:
【中文标题】如何将静态数组初始化为 C++ 函数中的某个值?【英文标题】:How to initialize a static array to certain value in a function in c++? 【发布时间】:2019-07-27 13:50:38 【问题描述】:我正在尝试在函数中初始化一个静态数组。
int query(int x, int y)
static int res[100][100]; // need to be initialized to -1
if (res[x][y] == -1)
res[x][y] = time_consuming_work(x, y);
return res[x][y];
我怎样才能做到这一点?
【问题讨论】:
您可能想了解for
循环。
@Hyperbola 您可以只使用静态布尔变量来保护由双循环执行的初始化... :) 编辑:哦,请检查 bolov 的 answer,它使用 λ 来初始化数组..!
@gsamaras 谢谢,lambda 太棒了!我从来没有想过像这样使用 lambda。
lambda 也可用于初始化 const
变量:***.com/questions/46345151/…
@bolov,你是对的。我只是想给出一个提示。毕竟,这似乎是家庭作业。但如果那是“提示 1”,那么“提示 2”将是 gsamaras 注释,使用静态布尔值作为警卫。这就是我最终要去的地方。
【参考方案1】:
首先,我强烈建议从 C 数组迁移到 std::array
。如果你这样做,你可以有一个函数来执行初始化(否则你不能,因为一个函数不能返回 C 数组):
constexpr std::array<std::array<int, 100>, 100> init_query_array()
std::array<std::array<int, 100>, 100> r;
for (auto& line : r)
for (auto& e : line)
e = -1;
return r;
int query(int x, int y)
static std::array<std::array<int, 100>, 100> res = init_query_array();
if (res[x][y] == -1)
res[x][y] = time_consuming_work(x, y);
return res[x][y];
另一个我更喜欢的选择是在 lambda 中执行初始化:
int query(int x, int y)
static auto res = []
std::array<std::array<int, 100>, 100> r;
for (auto& line : r)
for (auto& e : line)
e = -1;
return r;
();
if (res[x][y] == -1)
res[x][y] = time_consuming_work(x, y);
return res[x][y];
【讨论】:
这种 λ 方法非常赏心悦目,并且不会受到额外变量开销的影响。 . . :) 这太棒了!! 你能解释一下static auto res = [] ()
语法是什么吗?
@deoncagadoes 这是一个 lambda expression 。最后的()
调用了我们刚刚定义的lambda。
@deoncagadoes 是一个立即调用的 lambda en.cppreference.com/w/cpp/language/lambda【参考方案2】:
你不能这样做。您需要一个显式的 for 循环和一个标志以避免多次初始化:
int query(int x, int y)
static bool initilized = false;
static int res[100][100]; // need to be initialized to -1
if (!initilized)
initilized = true;
for (int i = 0; i != 100; ++i)
for (int j = 0; j != 100; ++j)
res[i][j] = -1;
if (res[x][y] == -1)
res[x][y] = time_consuming_work(x, y);
return res[x][y];
【讨论】:
【参考方案3】:你可以通过引入另外一个静态变量来做到这一点,例如下面的方式
int query(int x, int y)
static bool initialized;
static int res[100][100]; // need to be initialized to -1
if ( not initialized )
for ( auto &row : res )
for ( auto &item : row ) item = -1;
initialized = true;
if (res[x][y] == -1)
res[x][y] = time_consuming_work(x, y);
return res[x][y];
【讨论】:
【参考方案4】:您可以将fill
与std::array
和IIL(立即调用的lambda)一起使用:
static std::array<std::array<int, 100>, 100> res = [] ()
std::array<int, 100> default_arr;
default_arr.fill(-1);
std::array<std::array<int, 100>, 100> ret;
ret.fill(default_arr);
return ret;
();
【讨论】:
以上是关于如何将静态数组初始化为 C++ 函数中的某个值?的主要内容,如果未能解决你的问题,请参考以下文章