1

有没有办法将 '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

我想知道二维向量是否也可以像函数一样

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
4

2 回答 2

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]);
于 2012-07-19T21:58:19.163 回答
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] );
于 2012-07-19T21:56:32.847 回答