直接使用运算符[]设置std::vector内容

Setting std::vector contents directly using operator []

本文关键字:std 设置 vector 内容 运算符      更新时间:2023-10-16

我注意到,如果使用新的空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::vectoroperator[]访问向量内的元素,不多也不少。在一个空向量上做my_vector[0]正是前一段所说的。您正在访问您无权访问的内容。请注意,这不仅仅是在修改不存在的元素时。即使只是阅读它也是不明确的。

这是怎么回事?这只是简单地将1写入保留的内存空间吗?我应该预料到这会在我脸上爆炸,对吧?

你只是非常幸运,它没有真的在你脸上爆炸[1]。:)


[1] 有消息称,这种情况发生的可能性实际上比你想象的要高。因此,您应该小心,并练习安全(r)编码