Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/performance/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 在结构内创建非预定义大小的数组_C++ - Fatal编程技术网

C++ 在结构内创建非预定义大小的数组

C++ 在结构内创建非预定义大小的数组,c++,C++,我想处理图像,我想创建我的结构图像,前两个值是它的大小(灰度),第三个值是数据(大小为m×n的2D数组) 我如何实现它?如果我事先不知道图像的大小。大概是这样的: struct Image{ int n; int m; data = 2D array of size mxn } 相反,我会使用 struct Image{ int n; int m; vector<vector<int>> data; } struct图像

我想处理图像,我想创建我的结构图像,前两个值是它的大小(灰度),第三个值是数据(大小为m×n的2D数组)

我如何实现它?如果我事先不知道图像的大小。大概是这样的:

struct Image{
    int n;
    int m;
    data = 2D array of size mxn
}
相反,我会使用

struct Image{
    int n;
    int m;
    vector<vector<int>> data;
}
struct图像{
int n;
int m;
矢量数据;
}
当然,你可以使用一个有大小的一维向量

vector<int> data(m * n);
矢量数据(m*n);

忽略封装,类似的方法可能会奏效:

#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;
    }
}
#包括
结构映像{
int n;
int m;
std::vector data;//是否要更改int类型?
图像(int n,int m):n(n),m(m),数据(n){
对于(int行=0;行

如果您不只是在寻找快速而肮脏的东西,而且这将是一个正在进行的项目,我建议您学习更多关于面向对象的概念:)

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

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

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

第二种方法:伪结构由固定大小的头和动态部分组成。动态部件在结构中声明为大小为1。这显然是错误的,并且您不能在这样的结构上使用
sizeof
,但由于C不加强对数组与其工作的声明大小的比较:

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代码,但我引用它是因为它在微软Win32 API中有很大的应用。使用一维向量不是更容易吗?可能吧。我想这取决于他们对向量的预期用途。。。另外,这不应该是向量吗?这里需要哪些库?以及如何在主程序中创建这种类型的变量,如果没有确定这种类型的大小,那么,在C++中,一个非常常见的图像库是:“{代码>STD::向量< /代码>”,这可能是最好的方法。虽然你的问题太不清楚你的确切要求,无法得到适当的回答,并且对未来的研究很有帮助。顺便问一下,也许你想使用构造函数?
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;
}