【问题标题】:C++: Why is std::vector::data member function introduced?C++:为什么要引入 std::vector::data 成员函数?
【发布时间】:2019-02-13 04:37:38
【问题描述】:

我正在从下面的链接中查看 STL 的矢量容器。并且提到了添加到这个容器的新成员函数之一(使用C++11)是vector::data,它返回一个指向内部使用的内存数组的指针。

http://www.cplusplus.com/reference/vector/vector/data/

上面链接中给出的示例代码也显示了它的用法,但似乎所有这些都可以用迭代器完成。

引入这个成员函数有什么具体原因吗?

【问题讨论】:

  • 所以你可以将它传递给一个只接受指针的函数。
  • 仅用于需要指针的上下文。所有ContiguousContainer都可以被指针正确访问,所以我们有data
  • @Constructor,没错,并且通过对称性,所有 ContiguousIterators (en.cppreference.com/w/cpp/named_req/ContiguousIterator) 都应该有一个 data 函数。所有跨步迭代器都应该有一个basestride 函数,所有块迭代器都应该有一个blockposition 函数。等等
  • @pasha,没错,这是一件危险的事情,它破坏了std::vector 的一些抽象,这就是为什么你不应该使用它,如果你可以避免它,但有时你必须.如果您调用带有数组的 C 函数,您基本上没有任何其他选择。例如,假设您想对数据运行 FFT,您可能会为此使用 C 库,它将采用指针和大小(而不是迭代器)。 fftw.org/doc/Complex-One_002dDimensional-DFTs.html 。当然你可以用data做各种危险的事情,比如deallocate它。
  • @pasha,我认为你原来的问题的答案和最后评论中的要求已经以许多不同的形式重复了。在一个只有 C++ 存在的完美世界中,你是对的,迭代器就足够了,不幸的是,C++ 有时必须与其他语言(例如 C、Fortran 和 Python)进行通信,并与 OS 设备进行通信。在这种情况下,指针是允许这种通信的通用语言。所以,是的,data() 的主要原因是这个,其他纯 C++ hack 或不可移植的优化可能会使用它来完成。

标签: c++ c++11 vector stl member-functions


【解决方案1】:

我认为引入data()功能是为了界面的完整性和便利性。

这样我们就不需要诉诸&vec[0]&vec.front()的丑陋了。

此外,获取指向底层数据的指针在许多应用程序中都很有用,例如与 C 代码或某些外部库的接口,或者在嵌入式上下文中。

【讨论】:

  • 这样就避免了知道&vec[0]是否是空向量的UB。 :-)
【解决方案2】:

来自 cmets:

  • std::vector 是一个ContiguousContainer,可以通过指针访问。
  • 类 C 函数可能需要指针访问

有失败的可能:

  • 删除指针会使向量失效,并在向量被销毁时产生问题。

  • 导致向量中基础数据重新分配的所有内容(如添加元素或缩小)都会使指针指向悬空指针。 (正如 cmets 中所指出的,迭代器和引用也是如此)

【讨论】:

  • 请注意,常规迭代器也可能因某些操作(如向向量添加元素)而失效。
  • @Jarod42 可以,但是引用和指针也可以失效,不仅仅是迭代器。
  • @Constructor:通过阅读答案,我们可能认为迭代器比重新分配的指针更安全(忽略删除指针问题)。我只是想指出,在将元素添加到向量时,两者都/可能会失效。
猜你喜欢
  • 2015-05-03
  • 2018-02-17
  • 2022-01-03
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-11-16
相关资源
最近更新 更多