直接使用运算符[]设置std::vector内容
Setting std::vector contents directly using operator []
我注意到,如果使用新的空std::vector<int>
执行vec[0] = 1
,则vec.size()
将保持为0
。
然而,我仍然可以执行vec[0]
来检索我的1
。
这是在未定义行为的领域吗?这是怎么回事?这只是简单地将1
写入保留的内存空间吗?我应该预料到这会在我面前爆炸,对吧?
这确实是未定义的行为
[]
不检查边界,也不添加元素。您正在做的是向vector
使用的缓冲区进行写入和读取,但这被认为是未定义的行为。
您应该使用其中一种方法添加到向量中。
.push_back(0)
默认方法-附加到结束
.resize(num,0)
将vector
向上(或向下)调整为num
,并将新元素的值设置为第二个参数0。
vector
也可以用初始尺寸构造——vector(num,0)
或多或少与v = vector();v.resize(num,0)
相同
另一方面,为了安全地执行此操作,您可以使用.at(n)
来访问元素,如果您的访问超出了界限,这将引发std::out_of_range异常。
这是在未定义行为的领域吗?
是的。
请记住,C++数组和std::vector
的一般规则是,您不能访问无权访问的元素。新的std::vector
的大小为0
,这意味着它在逻辑上不包含任何元素(为空),因此您访问这些不存在的元素(谈到进入空;)
)
std::vector
的operator[]
仅访问向量内的元素,不多也不少。在一个空向量上做my_vector[0]
正是前一段所说的。您正在访问您无权访问的内容。请注意,这不仅仅是在修改不存在的元素时。即使只是阅读它也是不明确的。
这是怎么回事?这只是简单地将1写入保留的内存空间吗?我应该预料到这会在我脸上爆炸,对吧?
你只是非常幸运,它没有真的在你脸上爆炸[1]。:)
[1] 有消息称,这种情况发生的可能性实际上比你想象的要高。因此,您应该小心,并练习安全(r)编码
- std::设置自定义比较器
- std::p 设置或多组的修订问题
- std::设置大小时,vector的性能较低
- std::设置构造函数签名混淆
- 如果t不是不可或缺的,则如何禁用非空std ::设置为函数参数
- STD ::设置带有字符串键和潜在效率损失
- STD ::设置比较器,该比较器指的是外部值
- 用自定义比较器设置操作STD ::设置操作
- 为什么将指针指向std ::设置的提取节点是未定义的行为
- C++std::设置唯一性覆盖
- 在std ::设置中存储一个指针的指针是安全的吗?
- std::设置擦除复杂性异常
- STD ::设置以存储其元素V.S.std :: vector
- std::设置包含对与自定义比较器
- Is STD::设置我应该使用什么来将对象组织到层次结构中
- C++std::从std::deque复制到std:;设置
- 使用函数指针自定义std::设置比较器
- Std::设置快与慢,是怎么回事
- std::设置唯一指针
- std::设置.自定义集合