2012-07-19 95 views
1

有没有办法将'std :: vector 2d'作为指针传递给'2d c array'到一个功能。有没有办法将'std :: vector 2d'作为指向'2d c array'的指针传递给函数

我知道你可以将std :: vector 1d作为指向c数组的指针传递给某个函数。 例如, 功能:

void foo(char* str); //requires the size of str to be 100 chars 

std::vector<char> str_; 
str_.resize(100); 
foo(&str_[0]); //works 

我不知道是否是可能的2D矢量太像 功能

void foo(char** arr_2d); 

和矢量

std::vector<std::vector<char>> vector_2d; 

我尝试以下代码,但我得到一些与堆损坏相关的错误。

std::vector<std::vector<unsigned char>> vector_2d; 
//assuming function expects the size of the vector to be 10x10 
vector_2d.resize(10); 
for(int i=0;i<10;i++) 
{ 
    vector_2d[i].resize(10); 
} 
foo(&vector_2d[0]);//error here 
+0

好吧,现在终于* *所有这些修改后您的问题有一定的道理 – 2012-07-19 21:54:54

+0

顺便说一句,'char **'与数组数组一起使用,而不是2-D数组 – 2012-07-19 22:00:08

+0

不能直接做,对不起。你必须从你的矢量建立一个指针数组。 – 2012-07-19 22:09:56

回答

3

这里是你可以做什么:

std::vector< std::vector<unsigned char> > vector_2d; 
vector_2d.resize(10); 
std::vector<unsigned char*> ptrs(vector_2d.size()); 
for(int i=0;i<10;i++) 
{ 
    vector_2d[i].resize(10); 
    ptrs[i] = &vector_2d[i][0]; 
} 
foo(&ptrs[0]); 
0

不,你不能这样做。原因是char**是指向char的指针,但&vector_2d[0]的类型为std::vector<char>*

我建议你改变功能的接口,把你的二维矢量(你可能要重新设计是一类单持有std::vector<char>并提供operator()(int x,int y)在缓冲区访问元素(x,y)。另外,您也可以根据需要创建所需的数据结构:

std::vector<std::vector<char> > data2d; 
std::vector<char *> iface_adapter; 
iface_adapter.reserve(data2d.size()); 
for (unsigned int i = 0; i < data2d.size(); ++i) { 
    iface_adapter.push_back(&data2d[i][0]); 
} 
foo(&iface_adapter[0]); 
+0

但他得到函数调用之前的错误... – 2012-07-19 21:57:03

+0

@MattPhillips:这是一个错误的问题。我编辑了这个。 – 2012-07-19 21:58:05

+0

这不是一个错误..我得到错误之前的函数调用..正确的地方我错误在这里评论@JesseGood – int80h 2012-07-20 03:13:04