c++ - 如何将 3 维数据用作类属性?

标签 c++ arrays class initialization multidimensional-array

我已经有很长时间没有使用 C++ 了,但是我有一个使用 3 维数据的类,我不知道如何才能让它工作。我需要在构造函数中定义维度的大小。我在标题中试过这个:

class CImage
{
public:
    float values[][][];
...
}

在构造函数中:

CImage::CImage(int cols, int rows, int depth)
{
    values[cols][rows][depth];
}

但这会返回错误:“将‘值’声明为多维数组必须对除第一个维度之外的所有维度都有边界”。

在构造函数中使用它也不起作用:

values = new float[cols][rows][depth];

我也尝试过使用 vector ,但没有太大的成功。 header :

vector<vector<vector<float> > > values;

构造函数中没有任何内容。没有编译器错误,但是当我尝试设置一个值时:

values[c][r][d] = value;

程序崩溃。

看起来很基础,但我就是想不通......

最佳答案

程序在访问该 vector 时崩溃,因为它是空的,即这些索引处没有元素。

解决此问题的最佳方法是创建一个线性的一维 vector (甚至数组),并使用一对运算符 () 访问它,请参阅 C++FAQ Lite了解详情。或者使用 boost::multi_array .

例如:

#include <vector>
#include <iostream>
class CImage
{
        int X, Y, Z;
        std::vector<float> values;
public:
        CImage(int cols, int rows, int depth)
                : X(cols), Y(rows), Z(depth),
                values(cols*rows*depth) {}
        float operator()(int x, int y, int z) const
        {
                return values[Z*Y*x + Z*y + z];
                // or you lay it out differently in memory
                // if you please, transparent to the user:
                // return values[x + X*y + X*Y*z];
        }
        float& operator()(int x, int y, int z)
        {
                return values[Z*Y*x + Z*y + z];
                // likewise, in a different layout
                // return values[x + X*y + X*Y*z];
        }
};

int main()
{
        CImage ci(3,3,3);
        ci(2,2,2) = 7.0;
        std::cout << ci(2,2,2) << '\n';
}

关于c++ - 如何将 3 维数据用作类属性?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3717427/

相关文章:

c++ - 图形可视化(提升图)

c++ - bool 函数不会从文本文件中读取所有输入

php - 键为大整数的 PHP 数组问题

class - 编写成员函数时有什么更好的做法?

javascript - 创建一个具有特定原型(prototype)的空对象

c++ - 在虚继承中调用非虚基方法是否有额外的开销?

c++ - 损坏的双链表 : 0x0804d0c0 (C++)?

javascript - Javascript 中连接数组的不同值

python - Python 中使用 lambda 表达式(1 行)自定义 2D 列表排序

ruby-on-rails - 通过启用 cache_classes = true 手动重新加载已为 'cached' 的 Rails 类