我想使用Images,我想创建我的结构Image,前两个值是它的大小(灰度)和第三个 - 数据(大小为m乘以n的二维数组)。
我该如何实施?如果我事先不知道图像的大小。像这样:
struct Image{
int n;
int m;
data = 2D array of size mxn
}
答案 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中大量使用。