我有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扩展到第一维时,我都不想为已知尺寸设置尺寸。
这里最干净的解决方案是什么?
答案 0 :(得分:3)
为什么std::array
的{{1}} std::vector
为std::array
?
double
答案 1 :(得分:0)
这是一个很好的例子,说明从std::vector
继承它既合理又有用,提供:
您可以确定不会使用指向其矢量基类的指针删除它们(这将是未定义的行为,因为vector
析构函数不是virtual
)
如果你想使用它们,你准备写一个或两个转发构造函数
理想情况下,您在一个相对较小的应用程序中使用它,而不是将其作为具有大量分布式客户端用户的库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等建议不要这样做 - 我已经多次仔细阅读了他们的理由,如果你想为这种用法提供支持,请将相关的技术细节带到桌面上。 ...