【问题标题】:is std::vector same as array[number]? [duplicate]std::vector 是否与数组 [数字] 相同? [复制]
【发布时间】:2011-03-05 21:35:23
【问题描述】:

可能重复:
Are std::vector elements guaranteed to be contiguous?

std::vector 是否总是将顺序内存地址中的数据包含为 array[number]?

【问题讨论】:

标签: c++ stl vector


【解决方案1】:

当您使用标准分配器时,您可以确保在使用 std::vector 时分配的内存是连续的。换句话说,foo[n+1] 是序列中 foo[n] 之后的下一个元素。但是 std::vector 不是一个数组,就像

int* blah = new int[100];

不是数组。但是

int blah[100];

在栈上做的是一个数组。 指向已分配内存和数组的指针恰好共享语义。根据标准,它们并不相等,所以不要混淆两者。

【讨论】:

  • 这是不正确的。 new int[100] 确实创建了一个数组。 “由 new 表达式创建的实体具有动态存储持续时间......如果 [实体] 是一个数组,则 new 表达式返回一个指向数组初始元素的指针”(C++03 §5.3.4/1 )。 blah不是数组,而是new int[100]创建的对象。
  • 啊,对。感谢您的更正:-)
【解决方案2】:

是的,向量使用顺序内存来存储所有元素。这意味着随机访问几乎与普通数组的索引一样快。

但是向量在堆而不是堆栈中分配它的内存。所以在某些情况下它的效率可能会降低。

【讨论】:

    【解决方案3】:

    对于除 bool 以外的所有类型,标准要求元素在内存中是连续的:

    23.2.4/1 ... 向量的元素是连续存储的,这意味着如果 v 是一个向量,其中 T 是 bool 以外的某种类型,那么它遵循恒等式 &v[n] == &v[0 ] + n 代表所有 0

    请记住,std::vector<bool> 有特殊要求,与 bool 数组不同。

    【讨论】:

      【解决方案4】:

      是的。给定:

      std::vector<int> arr;
      

      你可以确定

      &arr[0]
      

      将为您提供一个指向连续整数数组的指针,这些整数可以(例如)传递给旧版 API。

      【讨论】:

      • 不,你不能。标准分配器使用 new 分配内存。分配的内存不是数组。整个前提是错误的。我可能很挑剔,但它仍然是真的。分配的内存不是数组。它们只是共享语义。
      • 通常你把它写成 &arr.front()
      • @Brian R. Bondy:我不同意。 &arr[0] 是 Effective STL 中指定的,我从未见过任何人自己使用 &arr.front()。 &arr[0] 也是 R Samuel Klatchko 的帖子中引用的标准 23.2.4/1 中的规范。
      • @Billy:好吧,我以前在任何地方都看到过 .front 方式。
      • @Mads:你在说什么?标准对此问题非常清楚:“由 new-expression 创建的实体具有动态存储持续时间 [...] 如果实体是非数组对象,则 new-expression i> 返回一个指向创建的对象的指针。如果是一个数组,new-expression 返回一个指向数组的初始元素的指针。"
      【解决方案5】:

      是的。但是,它不会在堆栈上分配。

      【讨论】:

      • 当然,除非你传递了一个分配器来做这件事。
      • @Noah Roberts:我不明白如何创建这样的分配器,因为这样的分配器的数据必须通过分配器的 allocate 方法持续存在。
      猜你喜欢
      • 2022-01-24
      • 2012-04-18
      • 2014-03-27
      • 1970-01-01
      • 2011-01-17
      • 1970-01-01
      • 2015-06-10
      • 2010-10-21
      • 2020-08-20
      相关资源
      最近更新 更多