如何初始化所有值都相同的二维数组?
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::vector
或 std::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;
}
我想用-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::vector
或 std::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;
}