C++ 在结构内创建非预定义大小的数组
我想处理图像,我想创建我的结构图像,前两个值是它的大小(灰度),第三个值是数据(大小为m×n的2D数组) 我如何实现它?如果我事先不知道图像的大小。大概是这样的: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图像
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;
}