【问题标题】:Setting std::vector contents directly using operator []使用运算符 [] 直接设置 std::vector 内容
【发布时间】:2013-08-30 05:07:54
【问题描述】:

我注意到如果我用一个新的空std::vector<int>vec[0] = 1vec.size() 仍然是0

但是我仍然可以使用vec[0] 来检索我的1

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

【问题讨论】:

    标签: c++ stl std


    【解决方案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 异常。

    【讨论】:

    • vec.at(0) = 1; 在这种情况下也将有助于抛出 out_of_range
    • @JonPurdy 是的,我自己添加的。
    • 在我提出更改后就得到了您的更改。 +1
    • 我认为你涵盖了所有的基础。很好的答案!
    【解决方案2】:

    这是在未定义行为的范围内吗?

    是的。

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

    std::vectoroperator[]访问 向量内的元素,不多也不少。在空向量上执行my_vector[0] 与前一段中所说的完全一样。您正在访问您无权访问的内容。请注意,这不仅仅是在您修改不存在的元素时。即使只是阅读它也是未定义的。

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

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


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

    【讨论】:

      猜你喜欢
      • 2013-01-29
      • 1970-01-01
      • 1970-01-01
      • 2018-12-16
      • 2014-11-04
      • 1970-01-01
      • 2011-06-25
      • 2019-05-07
      • 1970-01-01
      相关资源
      最近更新 更多