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

C++ STD::Vector-直接写入内部数组,c++,vector,stdvector,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

以下代码正常吗

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());
std::vector-var;
所需尺寸;
getenv_s(&requiredSize,NULL,0,“Something”);
如果(requiredSize==0)
{
返回环境不存在;
}
如果(变量size()

如果此代码正常,请有人向我解释如何更新
var
向量的
begin()
end()
值?看起来这段代码直接改变了向量的内部数组,而不是在
std::vector
api上-那么这些值是如何更新到实际大小的呢?

std::vector
保证了数据的连续存储,所以只要不溢出末尾,写入数据是完全正确的:

根据C++11标准第23.3.6.1.1节:

向量的元素是连续存储的,这意味着如果v是 一个向量,其中T是bool以外的某种类型,那么
除了
std::vector
神奇地将其名称从
var
更改为
svar
var
之外,所有0都遵守标识&v[n]==&v[0]+n,是的,这是要保存的。在C++11中(实际上也是在C++03中),您可以对std::string执行基本相同的操作,不需要在向量上临时复制。在C++03-TC1之前,标准保证数据是线性存储的,但不是连续存储的——向量可能会被填充,并且&v.begin()[i]不一定是第i个元素。但实际上,所有库实现都可以做到这一点。假设我将使用std::vector::data(),那么std::vector如何感知getenv_的更改。让我们说GETEVEVS函数故障-它开始改变VaR(0)数组,但是不知怎么在中间,VCuRe.Enter()如何知道内部数组何时改变?@ RRR:嗯,你不能使用<代码>数据()/代码>成员函数,因为它返回的指针是“代码> const < /Cord>”,所以不能写入它。你可以,但是,你可以通过现在的代码>和VEC(0)< /C>,因为最近的C++标准保证了关于<代码>向量<代码>的存储。关于“变得有意识”:函数<代码> GETNVIOS只写入缓冲区,数据在那里。向量不需要变得“意识”。“@bitmask:有
const
const
重载
vector::data()
(至少在C++11中是这样,但我相当肯定这不是新的).也许你想的是
std::string
?@MikeSeymour:哦,天哪,我一定是瞎了,我专门通过看来检查我的陈述,但一些神经元决定不看第一个过载。谢谢你指出!
getenv_s(&requiredSize, var.data(), var.size(), "Something");
if (requiredSize < var.size())
  var.resize(requiredSize);