c++ - 图像编辑器和 vector 尺寸 C++

标签 c++ vector rows

我正在开发一个使用 vector 的基本图像编辑器,我试图得到一个如下所示的矩阵,一个 4 x 4 但每个槽包含 3 个值(RGB 值)

 0  0  0    100 0  0      0  0  0    255   0 255
 0  0  0    0 255 175     0  0  0     0    0  0
 0  0  0    0  0  0       0 15 175    0    0  0
 255 0 255  0  0  0       0  0  0    255  255 255

到目前为止,我已经能够使用这段代码得到一个矩阵(我认为..)

int rows;
int columns;
fin >> rows;
fin >> columns;
vector<vector<int> > image_dimensions(rows);
for (int i = 0; i < rows; i++)
    image_dimensions[i].resize(columns);

这只是为了创建一个全为 0 的矩阵。我怎样才能使每个插槽包含三个 RGB 值,如示例所示?最后,我必须使用什么复杂的循环才能更改每个槽中的各个值,例如将 0 0 0 变成 155 0 255?

最佳答案

目前您使用原始整数类型。考虑存储一些更复杂的像 RGB 类:

class RGB {
private:
   std::unit8_t r, g, b;
public:
   RGB() {}
   RGB(int r, int g, int b) : r(r), g(g), b(b){ }
}

您可以简单地构造对象:

rgb = RGB(255,255,255);

之后,您可以将对象存储在 vector 中。

int rows;
int columns;
fin >> rows;
fin >> columns;
vector<vector<RGB> > image_dimensions(rows);
for (int i = 0; i < rows; i++)
   image_dimensions[i].resize(columns);

与您的示例不同的是, vector 可以存储 RGB 类中的对象。如果您愿意,现在可以遍历 vector :

for (int i = 0; i < columns; i++)
   for (int i = 0; i < rows; i++)
       image_dimensions[i][j] = RGB(0,0,0);

编辑: 根据评论,最好不要浪费空间并使用 uint8 类型。所以不再需要验证。 您可以使用平面 vector 并计算二维索引。如果您使用大矩阵,这将生成更有效的解决方案。

编辑2: 不创建新类的第二种可能的解决方案是使用 std 元组类:

std::tuple<std::unit8_t, std::unit8_t, std::unit8_t > rgb(0,0,0);

在这种情况下,您的 vector 必须存储这种元组。 更多元组信息:klick

顺便说一句:创建一个小类或结构不应该打扰你。 ;-)

关于c++ - 图像编辑器和 vector 尺寸 C++,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41925642/

相关文章:

c++ - 为什么 std::sort 假定 std::vector< std::vector<int>> 默认为 std::vector,从而产生错误的结果?

r - 提取给定行号上方和下方的 n 行(变量 n)

c++ - 函数需要参数并返回指向 void 函数的指针

c++ - 将 CMake 项目导入 CodeLIte

c++ - 双向链表未读取整个 txt 文件

c - 如何在 C 中编写自己的 vector 结构

c++ - 我可以在 STL::vector::iterator 上做指针运算吗

c++ - 为什么我不能在头文件中定义全局函数?

r - 根据特定列 R 中的值将列值乘以另一个值

bash - 使用 awk 将大型复杂的一列文件拆分为多列