【发布时间】: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函数。所有跨步迭代器都应该有一个base和stride函数,所有块迭代器都应该有一个block和position函数。等等 -
@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