如何用-1全局初始化2d数组



以下是基本代码。我想使数组全局化,这样我就不必为每个函数调用它。现在我如何用-1初始化2d数组。我试图在第3行下方使用memset(arr,-1,sizeof(arr((,但没有成功,所以,有人能告诉我我做错了什么吗??

#include <bits/stdc++.h>
using namespace std;
int arr[10][10];
int func(){
//this function will be using the global arr
// if(arr[x][y]!=-1)
//do something
}
int main(){
//the code
}

我不知道在不重复代码的情况下初始化内置数组的好方法。然而,我知道一种初始化std::array:的方法

#include <array>
#include <utility>
#include <cstddef>
template<size_t... Ix>
auto constexpr make1array(int v, std::index_sequence<Ix...>) {
auto populate = [](int v, size_t) { return v; };
std::array<int, 10> a = { populate(v, Ix)... };
return a;
}
template<size_t... Ix1, size_t... Ix2>
auto constexpr make2array(int v, std::index_sequence<Ix1...> seq, std::index_sequence<Ix2...>) {
auto populate = [](auto v, size_t)  { return v; };
std::array<std::array<int, 10>, 10> a = { populate(make1array(v, seq), Ix2)... };
return a;
}
std::array<std::array<int, 10>, 10> arr = make2array(-1, std::make_index_sequence<10>{}, std::make_index_sequence<10>{});

此代码生成一个数组,该数组在编译时预先填充了-1作为值。

函数memset无法工作,因为memset使用字节,并且许多整数占用多个字节。

IMHO,您最好的来源是使用std::fill
示例:

std::fill(&arr[0][0], &arr[9][9] + 1, -1);

否则,您总是可以回到嵌套循环:

for (int r = 0; r < MAX_ROWS; ++r)
{
for (int c = 0; c < MAX_COLUMNS; ++c)
{
arr[r][c] = -1;
}
}

最好的办法是让编译器优化嵌套循环。

可能有一些微优化可以使用,但编译器的工具箱中可能已经有了它们。

没有直接的方法通过非默认初始化结果的值来初始化原始数组。其中一个原因是数组不能从函数返回,也不能从任何不是{}-列表的对象直接赋值。

最简单的方法(自C++14以来(是使用constexpr构造函数使其成为类类型的一部分。在C++111中,具有非空主体的构造函数不能是constexpr

#include <iostream>
struct MinusOneArray {
static constexpr int NX =  10;
static constexpr int NY =  10;
int arr[NX][NY];

constexpr MinusOneArray() : arr() {
for(int i = 0; i < NX; ++i)
for(int j = 0; j < NY; ++j)
arr[i][j] = -1;
}
};
int main()
{
MinusOneArray a;
auto &arr = a.arr;

for(auto &line: arr) {
for(auto val: line)
std::cout << val << ",";
std::cout << std::endl;
}
}

另一种选择是使用标准结构std::array,并使用constexpr函数对其进行初始化,SergeyA就是这样提供的。

最新更新