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()
は右辺値式であるため、これは技術的に許可されていません。そのため、アドレスを取得できません)。
コンテナに少なくとも1つの要素があると仮定すると、コンテナの最初の要素のアドレスを取得する必要があります。
&something[0]
または&something.front()
(インデックス0の要素のアドレス)、または
&*something.begin()
(begin()
によって返されるイテレーターが指す要素のアドレス)。
C++ 11では、新しいメンバー関数がstd::vector
に追加されました:data()
。このメンバー関数は、&something.front()
と同様に、コンテナー内の初期要素のアドレスを返します。このメンバー関数の利点は、コンテナが空の場合でも呼び出すことができることです。
something.data()
は、ベクターのデータ空間へのポインターを返します。
代わりに、最初の要素へのポインターを取得します。
process_data (&something [0]);