std :: vector:vec.data()或&vec [0]

Ale*_*ato 24 c++ arrays vector

当您想要将std :: vector作为C数组访问时,您可以从至少四种不同的方式中进行选择,如本例中所示:

#include <iostream>
#include <vector>

using namespace std;

int main() {
  std::vector<int> vec;
  vec.push_back(1);
  vec.push_back(2);
  vec.push_back(42);
  vec.push_back(24024);
  {
    int* arr = vec.data();
    cout << arr << endl; /* output: 0x9bca028 */
    cout << arr[3] << endl; /* output : 24024 */
  }
  {
    int* arr = &vec.front();
    cout << arr << endl; /* output: 0x9bca028 */
    cout << arr[3] << endl; /* output : 24024 */
  }
  {
    int* arr = &vec[0];
    cout << arr << endl; /* output: 0x9bca028 */
    cout << arr[3] << endl; /* output : 24024 */
  }
  {
    int* arr = &vec.at(0);
    cout << arr << endl; /* output: 0x9bca028 */
    cout << arr[3] << endl; /* output : 24024 */
  }
}
Run Code Online (Sandbox Code Playgroud)

我在大多数情况下发现的那个是&vec[0].我认为这是最不优雅的,所以......为什么它最常用?它更有效还是更兼容?我找不到很多关于的文档data().

Ben*_*ley 18

data()是C++ 11的新手,这就是为什么你不经常看到它.使用的想法&vec.front()从来没有发生在我身上,可能是因为我operator[]经常使用front()(几乎从不).我想其他人也一样.

  • @MooingDuck No.它被添加完全让人们不必写:`v.empty()?NULL:&v [0]`. (7认同)

Edw*_*per 17

如果您使用的是C++ 11,那么使用data()它绝对是可取的.特别是,如果向量为空,则使用其他两个选项中的任何一个都会产生未定义的行为!如果你没有使用C++ 11,并且向量可能是空的,那么一定要检查那个条件.


cpp*_*guy 6

使用&vec [0]是最常见的,但我同意,看起来确实有些奇怪.有一点要记住未来.如果你的向量恰好是一个对象的向量,它的类重载了运算符&(),那么如果你调用&vec [0]就会意识到这会导致奇怪的行为.

这将不会获得内部连续对象数组中第一个项的起始地址,它将返回vec [0] .operator&()将返回的任何内容.大多数(如果不是全部的话),这不是你正在寻找的地址(绝地手波).

一个很好的例子是ATL的CComPtr.它会重载operator&(),因此将其存储在向量中可能会有问题.为了解决这个问题,ATL有一个CAdapt模板类,可用于在CComPtr上隐藏运算符&()