首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >向量: vec.data()或&vec[0]

向量: vec.data()或&vec[0]
EN

Stack Overflow用户
提问于 2012-05-24 15:01:45
回答 5查看 14.9K关注 0票数 36

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

代码语言:javascript
复制
#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 */
  }
}

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

EN

回答 5

Stack Overflow用户

回答已采纳

发布于 2012-05-24 15:05:53

data()对C++11来说是全新的,这就是为什么你不经常看到它的原因。我从来没有想到使用&vec.front()的想法,这可能是因为我使用operator[]的频率比front() (几乎从不)高。我想其他人也是一样的。

票数 24
EN

Stack Overflow用户

发布于 2012-05-24 15:10:42

如果您使用的是C++11,那么使用data()肯定更好。特别是,如果向量是空的,那么使用其他两个选项中的任何一个就会产生未定义的行为!如果您没有使用C++11,并且向量可能是空的,那么一定要检查该条件。

票数 23
EN

Stack Overflow用户

发布于 2012-05-24 18:17:03

使用&vec是最常见的,不过,我同意,看起来确实有点奇怪。对未来有一件事要记住。如果您的向量恰好是其类重载操作符&()的对象的向量,那么请注意,如果调用&vec,这将导致奇怪的行为。

这将不会获得对象内部连续数组中第一项的起始地址,它将返回vec.operator&()返回的任何内容。如果不是全部的话,那也不是你要找的地址(绝地之手挥手)。

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

票数 6
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/10740094

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档