簡體   English   中英

如何在全局范圍內使用 -1 初始化二維數組?

[英]How to initialize a 2d array with -1 globally?

下面是基本代碼。 我想全局創建數組,這樣我就不必為每個函數調用它。現在我如何用 -1 初始化二維數組。 我嘗試在第 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使用字節並且許多整數占用超過一個字節。

恕我直言,你最好的來源是使用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;
    }
}

最好的辦法是讓編譯器優化嵌套循環。

您可能會使用一些微優化,但編譯器的工具箱中可能已經有了它們。

沒有直接的方法可以通過不是默認初始化結果的值來初始化原始數組。 原因之一是數組不能從函數返回,也不能從不是 {}-list 的任何東西直接賦值。

最簡單的方法(自 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 是如何提供的。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM