【问题标题】:Is assigning to element of vector that has not been resized but reserve was called legal?分配给尚未调整大小但保留的向量元素是否合法?
【发布时间】:2013-10-31 16:27:22
【问题描述】:

简单的问题:

vector<int> vi;
vi.reserve(1984);
vi[84] = 1900;

这合法吗? 请注意,我们在这里谈论的不是某个 Widget,它的 dtor 可能会造成混乱,因为它认为位置 84 的元素正在被破坏,而在 pos 84 只有随机(或者可能是零-d)内存。

【问题讨论】:

  • 在这种情况下,您可能应该使用vi.resize(),而不是vi.reserve()
  • 直觉上这是未定义的行为,但我很难准确地追踪标准中的具体说明。

标签: c++ vector


【解决方案1】:

不,这是不合法的。只有0size()-1 才允许访问元素(当vector 不为空时)。如果为空,则不允许访问不存在的元素。

对于int,这没有多大意义,但对于 UDT T,这是能够容纳 T(这是 reserve() 提供的)和实际T 的实例,仅当它在 0size()-1 的有效范围内时才存在。

【讨论】:

  • 好的,但是考虑到矢量的实现,我看不出为什么这不起作用,你能引用 ISO 来满足 [0, size()-1) 的要求吗……无论如何这主要是理论上的,因为调整大小不应该比储备贵:)
  • @NoSenseEtAl 如果您接受 v[n] 仅在 v.at(n) 有效时有效,那么 23.2.3/17 应该回答它。
  • @NoSenseEtAl:实际上resize 更昂贵,因为它需要对整个部分进行值初始化(对于int,值初始化意味着初始化为零。
猜你喜欢
  • 2017-05-11
  • 2015-02-19
  • 1970-01-01
  • 1970-01-01
  • 2021-09-24
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-12-19
相关资源
最近更新 更多