ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

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

2019-08-25 14:15:35  阅读:302  来源: 互联网

标签: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());

如果这段代码没问题,有人可以解释一下如何更新var向量的begin()和end()值吗?看起来这个代码直接改变了向量的内部数组,而不是通过std :: vector api – 所以这些值如何更新为实际大小?

解决方法:

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

从C 11标准第23.3.6.1.1节:

The elements of a vector are stored contiguously, meaning that if v is
a vector where T is some type other than bool, then it
obeys the identity &v[n] == &v[0] + n for all 0 <= n < 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);

标签:c,vector,stdvector
来源: https://codeday.me/bug/20190825/1719567.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有