在 c++ 中将 2x2 的矩阵添加到向量中

Add a matrix of 2x2 into a vector in c++

本文关键字:添加 向量 c++ 中将 2x2      更新时间:2023-10-16

我正在尝试用 c++ 中的值矩阵填充向量。我对这个过程不是很自信(我对指针不太了解,我不知道我是否需要它),但是我正在尝试这个

int auxMat[gray.rows][gray.cols];
vector<int> collectionSum;
collectionSum.push_back(auxMat);

当我尝试编译时,我收到一个错误,上面写着

无效参数 '候选人是: 无效 push_back(const int &)

谁能告诉我是否可以做到,我该如何解决?

我读了一些关于擦除缓存,更改我的eclipse编译器,我的c ++版本的内容,但是我认为问题没有那么大。

不能将矩阵推回向量。您可以做的是为向量预分配内存(用于加快速度),然后使用 std::vector<>::assign 成员函数从矩阵"复制"到向量中:

vector<int> collectionSum(gray.rows * gray.cols); // reserve memory, faster
collectionSum.assign(*auxMat, *auxMat + gray.rows * gray.cols);

这应该很快。否则,您可以推回循环中的每个元素。

编辑

请参阅我可以将 2D 阵列视为连续 1D 阵列吗?,了解有关可能的未定义行为的一些技术细节(感谢@juanchopanza的评论)。我相信代码是安全的,因为矩阵的存储是连续的。

因为数组 auxMat 在内存中是连续的,所以你可以直接将其从内存复制到你的向量中。在这里,你告诉向量构造函数使用指针算法从 auxMat 的开头复制到它在内存中的结束:

std::vector<int> collectionSum(auxMat, auxMat + (gray.rows * gray.cols));

编辑:

抱歉,我将您的问题解读为一维数组(整数*)而不是二维(整数**)数组。老实说,我建议切换到 1D 阵列,因为它通常更快、更容易使用。根据您使用的是行优先顺序还是列优先顺序,您可以通过以下方式访问所需的元素:

elem = y * width + x;    // for row-first order
elem = x * height + y;   // for column-first order

例如:

// Create a 3x3 matrix but represent it continuously as a 1D array
const int A[] = {1, 2, 3, 4, 5, 6, 7, 8, 9};
const unsigned width = 3;
const unsigned height = 3;
for (int y = 0; y < height; ++y)
{
    for (int x = 0; x < width; ++x)
    {
       printf("%d ", A[y * width + x]);
    }
    printf("n");
}