【问题标题】:Is it safe to pass a pointer to the first element in a vector when an array is expected? [duplicate]当需要数组时,将指针传递给向量中的第一个元素是否安全? [复制]
【发布时间】:2012-08-27 14:44:34
【问题描述】:

可能重复:
Can I call functions that take an array/pointer argument using a std::vector instead?

我最近遇到了这样的事情:

class X {
    public: void foo(float* p, int elements);
};

= 一个需要浮点值数组的方法。

但在示例代码中,这是他们使用它的方式:

std::vector<float> bar;
bar.push_back(42);
// ...

X x;
x.foo( &bar[0], (int)bar.size() );

现在我想知道这是一种安全的方法,还是恰好适用于std::vector 的大多数实现? (也许这是一个运算符重载的事情?我对这些东西还没有那么自信..)

【问题讨论】:

  • 请注意,它现在有一个 data() 函数用于此目的。

标签: c++ arrays stdvector


【解决方案1】:

是的,很安全。

n3337 23.3.6.1/1。在 C++03 标准中,这是 23.2.4/1

向量是支持随机访问迭代器的序列容器。此外,它支持(摊销) 最后的恒定时间插入和擦除操作;在中间插入和擦除需要线性时间。贮存 管理是自动处理的,但可以给出提示以提高效率。 一个元素 向量是连续存储的,这意味着如果 v 是一个向量,而 T 是其他类型 比布尔值,那么它服从所有 0

【讨论】:

    【解决方案2】:

    是的,它是允许的,并且会像 Forever 指出的那样工作。但是,只有当您注意不要删除向量并在数组中留下悬空指针时,它才是安全的。由于您在数组和向量之间共享内存,因此由您来管理该内存。

    【讨论】:

      【解决方案3】:

      来自here

      因此,它们的元素按照严格的线性顺序排列

      使用该定义和元素访问运算符 ([]),然后表达式 &amp;avector[0] 获取第一个元素的地址,接下来的元素是它之后的连续序列。

      【讨论】:

      • 任何序列容器的元素都是“按照严格的线性序列排序的”,但这并不意味着它们存储在一个连续的数组中。链接的第二段会更相关:“矢量容器的元素存储在连续的存储位置”。
      • 确实,这也适用于std::list,其中元素不连续。
      猜你喜欢
      • 1970-01-01
      • 2022-01-12
      • 2013-07-21
      • 2020-08-08
      • 2015-12-21
      • 1970-01-01
      • 2019-12-28
      • 2015-02-19
      • 1970-01-01
      相关资源
      最近更新 更多