使用operator []直接设置std :: vector内容

时间:2013-08-30 05:07:55

标签: c++ stl std

我注意到,如果我vec[0] = 1新空std::vector<int>vec.size()仍为0

然而,我仍然可以vec[0]来检索我的1

这是否属于未定义的行为?这里发生了什么?这只是简单地将1写入保留的内存空间,我应该期待这会在我脸上爆炸,对吗?

2 个答案:

答案 0 :(得分:8)

确实是未定义的行为

[] 不检查边界而不添加元素。你正在做的是写入和读取vector使用的缓冲区,但这被认为是未定义的行为。


您应该使用其中一种方法添加到矢量。

.push_back(0)默认方法 - 附加到结尾

.resize(num,0)vector向上(或向下)调整为num,并将新元素的值设置为第二个arg,0。

vector也可以使用初始尺寸构建 - vector(num,0)v = vector();v.resize(num,0)或多或少相同


另一方面,为了安全地执行此操作,您可以使用.at(n)来访问元素,如果超出边界,这将引发std::out_of_range异常。

答案 1 :(得分:2)

  

这是否属于未定义的行为?

请记住,C ++数组和std::vector的一般规则是您无法访问您无权访问的元素。一个新的std::vector的大小为0,这意味着它在逻辑上不包含任何元素(为空),因此您访问这些不存在的元素时未定义(谈到达到void { {1}})

;)operator[] 访问元素中的元素,不多也不少。对空向量执行std::vector会完全按照前一段所述进行操作。您正在访问您无权访问的内容。请注意,这不仅仅是在修改不存在的元素时。即使只是阅读它也是未定义的。

  

这里发生了什么?这只是简单地将1写入保留的存储空间,我应该期待这会在我脸上爆炸,对吗?

你真的很幸运,它并没有在你脸上爆炸 [1] 。 :)


[1] 有消息称,发生这种情况的可能性实际上高于您的想法。因此,您应该注意并练习安全(r)编码。