三维数组作为数组的向量

时间:2014-03-07 15:27:32

标签: c++

我有3-dim double数组,在编译时已知有两个维度。 所以为了提高效率,我想写一些像

这样的东西
std::vector<double[7][19]> v;
v.resize(3);
v[2][6][18] = 2 * 7*19 + 6 * 19 + 18;

除非由于“v.resize(3)”而无法编译,否则它是完美的 请不要使用像

这样的嵌套向量
std::vector<std::vector<std::vector<double>>> v;

因为每次我将v扩展到第一维时,我都不想为已知尺寸设置尺寸。

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

2 个答案:

答案 0 :(得分:3)

为什么std::array的{​​{1}} std::vectorstd::array

double

答案 1 :(得分:0)

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

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

    < / LI>
  • 如果你想使用它们,你准备写一个或两个转发构造函数

  • 理想情况下,您在一个相对较小的应用程序中使用它,而不是将其作为具有大量分布式客户端用户的库API的一部分 - 客户端影响可能越麻烦,就越应该充满迂腐封装

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];
    }
};

这么少的努力,然后你有一个更好的,更不容易出错的v(a, b, c)符号。

关于推导,请注意:

  • 您的派生类型不会尝试在对象上强制执行不同的不变量

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

(缺少数据成员/额外基础意味着即使切片和通过vector*意外删除也可能在实践中有效,即使应该避免它们也很高兴知道你可能会玩吸烟而不是火。)

是的,我知道Alexandrescu,Sutter,Meyers等建议不要这样做 - 我已经多次仔细阅读了他们的理由,如果你想为这种用法提供支持,请将相关的技术细节带到桌面上。 ...