在结构内创建未预定大小的数组

时间:2014-11-25 19:21:17

标签: c++

我想使用Images,我想创建我的结构Image,前两个值是它的大小(灰度)和第三个 - 数据(大小为m乘以n的二维数组)。

我该如何实施?如果我事先不知道图像的大小。像这样:

struct Image{
    int n;
    int m;
    data = 2D array of size mxn
}

3 个答案:

答案 0 :(得分:1)

相反,我会使用

struct Image{
    int n;
    int m;
    vector<vector<int>> data;
}

你可以使用大小

的一维矢量
vector<int> data(m * n);

答案 1 :(得分:0)

忽略封装,这样的事情可以起作用:

#include <vector>

struct Image {

    int n;
    int m;
    std::vector<std::vector<int>> data; // May want to change int type ?

    Image(int n, int m) : n(n), m(m), data(n) {
        for (int row = 0; row < n; row++) {
            data[row].resize(m);
        }
    }
};

// Example Usage
Image img(10, 10);

for (int row = 0; row < img.n; row++) {
    for (int col = 0; col < img.m; col++) {
        img.data[row][col] = valueFromImageFile;
    }
}

如果您不只是寻找快速和肮脏的东西,这将是一个持续的项目,我建议您了解有关面向对象概念的更多信息:)

答案 2 :(得分:0)

有两种常见的模式(即使从C继承)。两者都有一个共同的原则:固定大小的头部和可变部分之间的逻辑分离。

第一种方法:struct包含固定大小的部分和指针(或通用情况下的指针)到使用new(在构造函数中)分配并在析构函数中释放的内存。它有点手动,但易于使用和理解。

图像可能看起来像(我假设Pixel是表示单个像素的类):

class Image {
private:
    int _x, _y;
    Pixel *data;

public:
    Image(int x, int y);
    ~Image();

    Pixel& getPixel(int i, int j) {
        return data[i * _y + j];
    }
};

Image::Image(int x, int y) {
    data = new Pixel[x * y];
    _x = x;
    _y = y;
}

Image::~Image() {
    delete[] data;
    data = NULL;
}

第二种方法:伪结构由固定大小的头部和动态部分组成。动态部分在结构中声明为大小为1.显然是错误的,你不能在这样的结构上使用sizeof,但是因为C不会强制将数组与声明的大小进行比较:< / p>

class Image {
private:
    int _x, _y;
    Pixel data[1];
    Image(int x, int y); // private to force usage of createImage

public:
    static Image* createImage(int x, int y);

    Pixel& getPixel(int i, int j) {
        return data[i * _y + j];
    }
};

Image* Image::createImage(int x, int y) {
    Image* image = (Image *) malloc(sizeof(Image) + (x * y - 1) * sizeof(Pixel));
    image->_x = x;
    image->_y = y;
    return image;
}

我必须承认它实际上是嵌入在C ++中的C代码,但我引用它是因为它在Microsoft Win32 API中大量使用。