如何将静态数组初始化为 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】:

您可以将fillstd::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++ 函数中的某个值?的主要内容,如果未能解决你的问题,请参考以下文章

如何将二维数组的所有元素初始化为java中的任何特定值

将字节数组初始化为某个值,而不是默认的null? [复制]

将一个多维数组初始化为一个类 c++中的成员

将一个多维数组初始化为一个类 c++中的成员

C++静态结构体数据成员的初始化

如何通过函数在 C++ 中设置私有静态数组?