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看起来这段代码直接更改了向量的内部数组,而不是通过std::vectorapi - 那么这些值如何更新为实际大小?

4

1 回答 1

11

std::vector保证数据是连续存储的,所以写入数据,只要你不超出结尾就可以了:

来自 C++11 标准部分 23.3.6.1.1:

向量的元素是连续存储的,这意味着如果 v 是一个向量,其中 T 是除 bool 之外的某种类型,那么对于所有 0 <= n < v,它都遵循恒等式 &v[n] == &v[0] + n 。尺寸()​​。

但是,请注意调整向量的大小可能会移动数据并使迭代器无效。

不幸的是,标准不需要std::vector<T>::iterator是原始指针类型(尽管通常是)。因此,您不能便携地使用std::vector<T>::begin()来访问第一个元素。有std::vector<T>::data(),它返回指向第一个元素的指针,可用于需要原始 c 数组的代码。

我建议像这样重写你的电话:

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