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