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

関数のように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
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 に答える