STD :: Vector-直接写入内部数组

时间:2013-09-12 08:52:58

标签: c++ vector stdvector

以下代码是否正常?:

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::vector api - 所以这些值如何更新为实际大小?

1 个答案:

答案 0 :(得分:6)

std::vector保证数据连续存储,所以写入数据,只要你没有超出结束就完全没问题了:

从C ++ 11标准第23.3.6.1.1节:

  

矢量的元素是连续存储的,这意味着如果v是   一个向量,其中T是某种类型而不是bool,然后它   对于所有0&lt; = n&lt; 0&lt; = n&lt; n&lt; = n&lt; n&lt; v.size()。

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

不幸的是,该标准不要求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);