簡體   English   中英

std :: array的std :: array是否具有連續的內存?

[英]Does std::array of std::array have contiguous memory?

似乎,我發現如何用兩行代碼輕松獲得具有連續內存的普通2D數組:

template<int N, int M>
using Array2D = array<array<int, M>, N>;

讓我們解決在Array2D交換最小值和最大值的簡單任務(c ++ 17的一部分):

template<int N, int M>
void printArray2D(const Array2D<N, M> &arr);

int main() {
    const int N = 5;
    const int M = 5;
    Array2D<N, M> arr;

    // random init of Array2D 
    generate(arr.front().begin(), arr.back().end(), []()->int {
                                                        return rand() % 100;
                                                    });

    printArray2D(arr);

    auto[a, b] = minmax_element(arr.front().begin(), arr.back().end());

    cout << "Swap minimum and maximum: " << *a << " " << *b << endl << endl;

    iter_swap(a, b);
    printArray2D(arr);

    return 0;
}

template<int N, int M>
void printArray2D(const Array2D<N, M> &arr) {
    for (const auto &row : arr) {
        for (const auto &elem : row) {
            cout << std::setw(3) << elem;
        }
        cout << endl;
        cout << endl;
    }
}

我在Visual Studio 2017中得到了下一個結果:

 41 67 34  0 69

 24 78 58 62 64

  5 45 81 27 61

 91 95 42 27 36

 91  4  2 53 92

Swap minimum and maximum: 0 95

 41 67 34 95 69

 24 78 58 62 64

  5 45 81 27 61

 91  0 42 27 36

 91  4  2 53 92

優點:

  • 僅需2條簡單的線即可獲得2D陣列
  • 您通常可以將元素訪問為arr[2][2]
  • 您可以使用STL算法

缺點:

  • 該解決方案在調試模式下無法正常工作,我的運行時錯誤array iterators incompatible
  • 我不知道是否總是會連續分配內存
  • 我不知道它是否可以在其他編譯器中使用
  • 魔術迭代器

問題:

  • 是否Array2D確保Array2D連續分配?
  • 以這種方式使用數組迭代器是否合格? (不同的迭代器,但要記住連續的和對指針的實現)
  • 以這種方式(例如)在生產代碼中使用Array2D是否安全? 如果不是,您能否以最小的代碼開銷提供良好的代碼來解決此任務?
  • geza :這個答案與嵌套數組的連續性相矛盾。 也許C ++ 14發生了變化?

根據標准,內存應該是連續的。 26.3.7.1 [array.overview]段落指出(強調我的意思):

標頭定義用於存儲固定大小的對象序列的類模板。 數組是一個連續的容器 數組的實例存儲N個類型為T的元素,因此size()== N是不變量。

更新:看來實現可能包括填充。 這些SO帖子中提供了有關該主題的更多信息:
std :: array的大小是否由標准定義?
特別是這個答案:
嵌套std :: arrays中的數據是否保證是連續的?

暫無
暫無

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

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