我正在尝试使用c ++中的值矩阵填充向量。我对这个程序不是很自信(我不太了解指针,我不知道我是否需要它)但是我正在尝试这个
int auxMat[gray.rows][gray.cols];
vector<int> collectionSum;
collectionSum.push_back(auxMat);
当我尝试编译时,我收到一个错误,上面写着
无效参数'候选者是:void push_back(const int&amp;)
任何人都可以告诉我它是否可以做到,我该如何解决?
我读过一些关于擦除缓存,更改我的eclipse编译器,我的c ++版本的内容,但是我不认为这个问题太大了。
答案 0 :(得分:0)
您无法将矩阵推回到矢量中。您可以做的是为您的向量预分配内存(为了加快速度),然后使用std::vector<>::assign
成员函数来复制&#34;复制&#34;从矩阵到矢量:
vector<int> collectionSum(gray.rows * gray.cols); // reserve memory, faster
collectionSum.assign(*auxMat, *auxMat + gray.rows * gray.cols);
这应该很快。否则,您可以在循环中推回每个单独的元素。
编辑
有关可能的未定义行为的一些技术问题,请参阅May I treat a 2D array as a contiguous 1D array?(感谢@juanchopanza的评论)。我相信代码是安全的,因为矩阵的存储是连续的。
答案 1 :(得分:0)
因为数组auxMat在内存中是连续的,所以你可以直接从内存中将它复制到向量中。在这里,您告诉向量构造函数使用指针算法从auxMat的开头复制到内存结束:
std::vector<int> collectionSum(auxMat, auxMat + (gray.rows * gray.cols));
编辑:
抱歉,我把你的问题看作是一维数组(int *)而不是2D(int **)数组。老实说,我建议切换到一维数组,因为它通常更快更容易使用。根据您使用的行优先顺序还是按列优先顺序,您可以通过以下方式访问所需的元素:
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");
}