6

次のコードは大丈夫ですか?:

std::vector<char> var;
size_t requiredSize;

getenv_s(&requiredSize, NULL, 0, "Something");
if (requiredSize == 0)
{
   return ENV_NOT_EXIST;
}
if(var.size() < requiredSize)
    var.resize(requiredSize);

// Get the value of the environment variable.
getenv_s(&requiredSize, &var[0], requiredSize, "Something");

std::string str(var.begin(),var.end());

begin()このコードに問題がなければ、ベクターのと のend()値がどのようにvar更新されるか説明してもらえますか? このコードは、API ではなくベクターの内部配列を直接変更しているように見えます。では、std::vectorこれらの値は実際のサイズにどのように更新されるのでしょうか?

4

1 に答える 1

11

std::vectorデータが連続して保存されることを保証するため、最後をオーバーランしない限り、データへの書き込みは完全に問題ありません。

C++11 標準セクション 23.3.6.1.1 から:

ベクトルの要素は連続して格納されます。つまり、T が bool 以外の型の場合、v がベクトルである場合、すべての 0 <= n < v に対して恒等式 &v[n] == &v[0] + n に従います。 。サイズ()。

ただし、ベクトルのサイズを変更すると、データが移動し、反復子が無効になる可能性があることに注意してください。

残念ながら、標準では生のポインター型である必要はありませんstd::vector<T>::iterator(通常は必要です)。std::vector<T>::begin()そのため、最初の要素にアクセスするために移植可能に使用することはできません。最初の要素へのポインターをstd::vector<T>::data()返し、生の c-array を期待するコードに使用できる があります。

呼び出しを次のように書き直すことをお勧めします。

getenv_s(&requiredSize, var.data(), var.size(), "Something");
if (requiredSize < var.size())
  var.resize(requiredSize);
于 2013-09-12T08:57:12.550 に答える