C++ 作为阵列向量的三维阵列

C++ 作为阵列向量的三维阵列,c++,C++,我有一个三维双数组,它的两个维度在编译时是已知的。 所以为了提高效率,我想写一些 std::vector<double[7][19]> v; v.resize(3); v[2][6][18] = 2 * 7*19 + 6 * 19 + 18; std::vector v; v、 调整大小(3); v[2][6][18]=2*7*19+6*19+18; 它非常完美,只是因为“v.resize(3);”而无法编译 请不要建议我使用嵌套向量,如 std::vector<std::

我有一个三维双数组,它的两个维度在编译时是已知的。 所以为了提高效率,我想写一些

std::vector<double[7][19]> v;
v.resize(3);
v[2][6][18] = 2 * 7*19 + 6 * 19 + 18;
std::vector v;
v、 调整大小(3);
v[2][6][18]=2*7*19+6*19+18;
它非常完美,只是因为“v.resize(3);”而无法编译 请不要建议我使用嵌套向量,如

std::vector<std::vector<std::vector<double>>> v;
std::vector v;
因为我不想每次扩展v的第一个维度时都为已知维度设置大小

这里最干净的解决方案是什么?

为什么不使用
std::array
double

std::vector<std::array<std::array<double, 19>, 7>> v;
std::vector v;

这是一个很好的例子,说明从
std::vector
继承既合理又有用,提供:

  • 您可以使用指向向量基类的指针确保它们不会被删除(这将是未定义的行为,因为
    向量
    析构函数不是
    虚拟的

  • 如果您想使用它们,您已经准备好编写一两个转发构造函数

  • 理想情况下,您将在一个相对较小的应用程序中使用它,而不是将其作为一个拥有大量分布式客户端用户的库API的一部分—客户端影响越大,完全封装就越迂腐

模板
struct Vec_3D:std::vector
{
T运算符(大小x、大小y、大小z)
{
返回(*此)[x*Y*Z+Y*Y+Z];
}
常量T和运算符(大小x、大小y、大小z)常量
{
返回(*此)[x*Y*Z+Y*Y+Z];
}
};
只要稍加努力,就可以得到一种更好、更不容易出错的
v(a,b,c)
符号

关于推导,请注意:

  • 派生类型不尝试在对象上强制使用不同的不变量

  • 它不添加任何数据成员或其他基础

(缺少数据成员/额外的基础意味着,即使是通过
向量*
进行切片和意外删除,在实践中也可能会起作用,尽管它们应该被避免。很高兴知道你可能在玩火而不是玩火。)

是的,我知道Alexandrescu、Sutter、Meyers等。建议不要这样做-我已经仔细阅读了他们的理由好几次,如果你想支持他们,即使是这种用法,请将相关的技术细节提交给我们

template <typename T, size_t Y, size_t Z>
struct Vec_3D : std::vector<std::array<std::array<T, Y>, Z>>
{
    T& operator(size_t x, size_t y, size_t z)
    {
        return (*this)[x * Y * Z + y * Y + z];
    }

    const T& operator(size_t x, size_t y, size_t z) const
    {
        return (*this)[x * Y * Z + y * Y + z];
    }
};