2015-06-14 101 views
-1

我想用C++中的一个矩阵的值填充一个矢量。我不是很自信的用这个程序(我不知道还有关于指针,我不知道如果我需要在这里),但是我想这个在C++中添加一个2x2矩阵到一个矢量中

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

当我尝试编译我收到它说

参数无效“考生的错误:无效的push_back(const int的&)

谁能告诉我还判定是否有可能做的,我该怎么解决呢?

我看了一些关于删除缓存,改变了我的Eclipse编译器,我的C++版本,但我不认为这个问题是这么大。

+0

到'的push_back()'的值个别。 –

回答

0

您无法将矩阵推回到矢量中。你可以做的是预先分配的内存为您的载体(超速的事情了),然后使用std::vector<>::assign成员函数从矩阵“拷贝”到载体:

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)的一些技术性问题。由于矩阵的存储是连续的,因此我相信代码是安全的。

+0

我认为有一些关于超出界限的问题,这使得这在技术上是UB,尽管很难想到这种方法无效的实现。我会看看我能否找到一些链接。 – juanchopanza

+0

@juanchopanza其实这正是我现在的想法......因为我们超出界限,但是我们有连续的存储空间。 – vsoftco

+0

有这样的:http://stackoverflow.com/questions/7269099/may-i-treat-a-2d-array-as-a-contiguous-1d-array – juanchopanza

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"); 
} 
+0

哎呀抱歉,我将auxMat阅读为一维数组 – Dawud