5

unsigned char多くの配列を使用するコードを書き直して、代わりにstd::vector<unsigned char>オブジェクトを使用したいと考えています。私が抱えている問題は、これらが現在、シリアルポートまたはソケット書き込みバッファーのいずれかに書き込まれるデータを格納するために使用されており、これを行うライブラリ関数がまたはのいずれvoid*かを取ることunsigned char*です。このような関数の例は次のとおりです。

  WriteToSocketBuffer(unsigned char* pBuffer, int iSize);

現在、私はフォームのコードを持っています

 unsigned char* pArray = new unsigned char[iSize];
 //   populate array with data
 WriteToSocketBuffer(pArray,iSize);
 delete [] pArray;

私の質問は次のとおりです。クラスをstd::vector<unsigned char>生の配列の代わりに持つように変更した場合、次を使用してライブラリ関数を呼び出すことができますか

  std::vector<unsigned char> myVector;
  WriteToSocketBuffer(&myVector[0],myVector.size());

ベクトルの最初の要素のアドレスを渡すことは、生の配列の最初の要素のアドレスを渡すことと同じように機能しますか。こんなに簡単なの?

4

3 に答える 3

12

はい、ベクトルの要素は、配列と同様に連続していることが保証されています。

参照:

C++03 標準: [lib.vector] 23.2.4 クラス テンプレート ベクトル

......
ベクトルの要素は連続しvvector<T, Allocator>格納されますTbool&v[n] == &v[0] + n0 <= n < v.size()

于 2012-08-21T16:04:45.563 に答える
6

C++98 は、 内のデータの連続した割り当てを義務付けていませんでしたstd::vectorが、既知のすべての実装ではとにかくそうしていました。

C++03 の時点で、それが要件として標準化されたので、現在では、たまたまどうなるかだけでなく、必須になっています。

于 2012-08-21T16:07:17.487 に答える