1. ホーム
  2. c++

[解決済み] 生データへのstd::vectorポインタを取得する方法は?

2022-04-22 06:01:23

質問

を使おうとしています。 std::vector として char の配列になります。

私の関数はvoidポインタを取り込みます。

void process_data(const void *data);

以前は単にこのコードを使っていただけでした。

char something[] = "my data here";
process_data(something);

これは期待通りに動作しました。

しかし、今私は、動的な std::vector というわけで、代わりにこんなコードを試してみました。

vector<char> something;
*cut*
process_data(something);

問題は、どのようにcharベクトルを関数に渡せば、ベクトルの生データ(floatなど、どのようなフォーマットであっても)にアクセスできるのか、ということです。

こんなことをやってみました。

process_data(&something);

そして、これ。

process_data(&something.begin());

しかし、ちんぷんかんぷんなデータへのポインタが返され、後者は警告を発した。 warning C4238: nonstandard extension used : class rvalue used as lvalue .

解決方法は?

&something のアドレスが表示されます。 std::vector オブジェクトのアドレスであり、それが保持するデータのアドレスではありません。 &something.begin() が返すイテレータのアドレスが得られます。 begin() (コンパイラが警告しているように、これは技術的に許可されていませんので something.begin() はrvalue式なので、そのアドレスは取得できない)。

コンテナの中に少なくとも1つの要素があると仮定して、コンテナの初期要素のアドレスを取得する必要があります。

  • &something[0] または &something.front() (インデックス0にある要素のアドレス)、または

  • &*something.begin() (で返されるイテレータが指す要素のアドレス)。 begin() ).

C++11では、新しいメンバ関数が std::vector : data() . このメンバ関数は、コンテナ内の初期要素のアドレスを返します。 &something.front() . このメンバ関数の利点は、コンテナが空でも呼び出しても問題ないことです。