web-dev-qa-db-ja.com

生データへのstd :: vectorポインタを取得する方法は?

std::vectorchar配列として使用しようとしています。

私の関数は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

142
Rookie

&somethingは、保持しているデータのアドレスではなく、std::vectorオブジェクトのアドレスを提供します。 &something.begin()は、begin()によって返されるイテレータのアドレスを提供します(something.begin()は右辺値式であるため、これは技術的に許可されていません。そのため、アドレスを取得できません)。

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

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

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

C++ 11では、新しいメンバー関数がstd::vectorに追加されました:data()。このメンバー関数は、&something.front()と同様に、コンテナー内の初期要素のアドレスを返します。このメンバー関数の利点は、コンテナが空の場合でも呼び出すことができることです。

219
James McNellis

something.data()は、ベクターのデータ空間へのポインターを返します。

72
Chris Dodd

代わりに、最初の要素へのポインターを取得します。

process_data (&something [0]);
12
Steven Don