如何初始化所有值都相同的二维数组?

How to initialize a 2D array with all values same?

我想用-1作为所有值来初始化一个二维数组。为此,我使用了 memset()

#include <bits/stdc++.h>
using namespace std;

int dp[100][100];
memset(dp, -1, sizeof(dp));

int dynamicProgramming(some parameters)
{
    //I want to use dp[][] array here
}

int main() {
    cout<<dp[99][99];
    return 0;
}

但是我收到一个错误

prog.cpp:5:7: error: expected constructor, destructor, or type conversion before ‘(’ token
 memset(dp, -1, sizeof(dp));

你能告诉我正确的做法吗?

没有办法(至少我不知道)初始化数组的所有元素,除了0

您可以通过某种方式变通,因为您在文件范围内初始化另一个变量的过程中调用 memset

int dp[100][100];
auto x = memset(dp, -1, sizeof(dp));

int main() {
    cout<<dp[99][99];
    return 0;
}

但注意:全局变量初始化的顺序不保证;您唯一可以依赖的是 memset 将在输入函数 main 之前执行。但是你也可以把它作为 main 中的第一行。

另外请注意,当您想要初始化类型为 int 的数组元素时,您需要运气,因为单个 int 包含多个字节; memset 在字节级别而不是元素类型级别填充元素。例如,memset(dp, -2, sizeof(dp)) 而不是 导致用 -2 填充的数组;甚至 -1 也需要架构是两者的互补才能工作。

正如其他人所说,您不能在全局范围内调用 memset。最正确和清晰的 vay 可能是

#include <iostream>
using namespace std;

const int D1 = 100;
const int D2 = 100;
int dp[D1][D2];

void initializeDp()
{
    for (int i = 0; i < D1; i++) {
        for (int j = 0; j < D2; j++) {
            dp[i][j] = -1;
        }
    }
}

int main() {
    initializeDp();
    cout << dp[D1-1][D2-1];
    return 0;
}

显然,如果您将全局变量算作一个好习惯。 我个人会使用 2d std::array,所以它会包含它自己的大小

for (auto& v : dp) {
    std::fill(std::begin(v), std::end(v), -1);
}

内部函数,不是全局范围。

您不能在全局范围内使用 memset。 必须写在main范围内。

#include <bits/stdc++.h>
using namespace std;

int dp[100][100];

int main() {
    memset(dp, -1, sizeof(dp));
    cout<<dp[99][99];
    return 0;
}

实际上,在这种情况下,可以编写一个有用的模板化函数,它本身基于简单的 for-range 循环。

一个优点是它适用于其他类型的二维数组。

#include    <iostream>

template <typename T2d, typename T>
void init2d (T2d &arr, T val) {
    for (auto& row: arr) {
        for (auto& i: row) {
            i = val;
        }
    }       
}

int main() {
    const int  n = 5, m = 6;
    int a[n][m];

    init2d (a, -1);
    std::cout << a[n-1][m-1] << "\n";
}

如果想在main之前初始化,最简单的方法就是依赖STL,例如在 std::vectorstd::array 上,像这样,对于 5x6 矩阵:

std::vector<std::vector<int>> b(5, std::vector<int> (6, -1));

您似乎正在寻找一种在 main 之前初始化全局数组的方法,如 Call a function before main 中所述?通常我会建议避免特定于编译器的扩展,但您的代码已经是特定于编译器的,对您来说似乎没问题。这是一个 gcc 扩展。它会导致奇怪的错误。其他全局对象可能未初始化。此代码的某些部分可能会导致未定义的行为。搬起石头砸自己的脚

#include <bits/stdc++.h>
using namespace std;

void beforeMain (void) __attribute__((constructor));

int dp[100][100];
void beforeMain (void) {
    memset(dp, -1, sizeof(dp));
}

int main() {
    std::cout << dp[0][0] << std::endl;
}