C++:可变长度多维数组

标签 c++ c++11 multidimensional-array

<分区>

我需要一个二维数组,其中两个维度的长度在编译时都是未知的。我要[][]访问权限。

关于这个已经有几个问题了,建议boost::multi_array , std::vector<std::vector<type>> ,为 x 维度分配一个数组,为 y 维度分配 X 数组,依此类推。

要注意的是我无法控制数据,它已经作为单个连续数组存在(大小 x*y )。我有一个指向它的指针和两个维度的大小,我或多或少地包装它以获得 [][]访问权限。

我想避免创建一大堆对象(比如分配一个 std::vector 数组并将它们全部指向正确的对象),然后提升。

我考虑创建一个类来保存维度和指针,并重载 [][] , 但这不起作用因为 [][]是两个运算符,第二个 []适用于不同的对象。

最终我正在寻找相当于使用 [][] 的东西作为某种 access(int x, int y) 的语法糖功能。这可能吗?

最佳答案

你可以把它包装在一个类中并重载operator [],像这样:

template <typename T>
class MultiArray
{
public:
    explicit MultiArray(T* arr, int sizex, int sizey) : data(arr), sizey(sizey) {}

    const T* operator [] (int x) const { return &data[x * sizey]; }
    T* operator [] (int x) { return &data[x * sizey]; }

private:
    T* data;
    int sizey;
};

Live example

关于C++:可变长度多维数组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25402881/

相关文章:

c++ - 读取二进制文件并正确使用流迭代器

c++ - 我应该如何处理 C++ 中可移动类型中的互斥锁?

c++ - 将文件路径字符串传递给 Boost.Spirit 中的语义操作

c++ - 当 float 转换为 int 时,此代码中如何/为什么会发生缩小

c++ - 为什么模板类型推导在这里失败了?

java - 以矩阵格式打印二维数组

javascript - 在javascript中从多维数组中删除特殊元素

c++ - 删除通过 memcpy 从字符串类复制的字符串时崩溃

c++ - 如果异常保存在 std::exception_ptr 中,那么在 catch 语句之外使用异常是否安全?

ios - 在 Swift 中提取二维数组的一部分