【问题标题】:Best practice for allocating a continuous 2d array on the heap using c++14使用 c++14 在堆上分配连续二维数组的最佳实践
【发布时间】:2017-11-04 00:17:53
【问题描述】:

我很难找到以下问题的答案:

在 c++14 中分配在内存中连续的整数的二维数组的最佳实践方法是什么。

条件:

  • 宽度和高度在编译时是已知的,但出于各种原因,我仍想将二维数组放在堆上。
  • 我想使用二维语法 arr[x][y] 访问内存位置
  • 如果可能,我不想实现自己的包装器

子问题:

  • 我必须使用 std::array 还是原生 int[][dim] 语法可用?
  • 二维数组可以有一个 unique_ptr 吗?

提前感谢您的回答。

【问题讨论】:

  • std::vector<std::vector<int>> vec(n, std::vector<int>(m)); 如果在编译时知道大小,请不要使用动态内存。
  • @DeiDei 这不会是连续的,而且效率会很低。至于你的第二句话,那就错了。
  • auto &arr = *new std::array<std::array<TYPE, height>, width>?还是std::vector<std::array<TYPE, height>> arr(width);
  • @DeiDei 你建议使用std::vector,你建议不要使用std::vector
  • 使用std::vector<int> 并计算每次访问的偏移量。删除需求三并调整需求二,以便包装类的语法变为arr(x, y)

标签: c++ c++14


【解决方案1】:

您可以使用包含原始数组的unique_ptr

std::unique_ptr<int[][Y]> p(new int[X][Y]);

但是,这并不能让您在第一个轴上进行有意义的边界检查,也不能让您使用基于范围的 for 进行迭代。


您可以使用包含std::arrayunique_ptr

std::unique_ptr<std::array<std::array<int, Y>, X>> p;

但是,这不会让您建立索引,因为 operator[] 只为原始数组定义。


我只想编写我自己的包装器,让我两者兼得。比如:

template <typename T, size_t X, size_t Y>
struct Array {
    Array() {
        p.reset(new T[X][Y]);
    }   

    using row = T[Y];

    row* begin() { return p.get(); }
    row* end() { return p.get() + X; }

    row& operator[](size_t y) { return p[y]; }

    std::unique_ptr<int[][Y]> p;
};

【讨论】:

猜你喜欢
  • 2021-12-02
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-05-26
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多