【问题标题】:Is std::vector::begin() from priorC++11 equivalent to std::vector::data() in C++11?来自priorC++11的std::vector::begin()是否等同于C++11中的std::vector::data()?
【发布时间】:2016-05-04 13:12:24
【问题描述】:

来自prior-C++11std::vector::begin() 是否等同于C++11 中的std::vector::data()? 我问这个的原因,早于 C++11,我曾经将 std::vector::begin() 视为指针,但在 C++11 之后,它不是,而且我不能转换为等效的指针。那么,在 C++11 之后我可以使用 data() 代替吗?

【问题讨论】:

  • std::vector::begin() 从来都不是指针。
  • 如果您过去将std::vector::begin() 视为指针,那么您将依赖特定实现的std::vector::iterators 表示作为指针。从来没有保证会这样。
  • 您是否使用&(*std::vector::begin()) 获取指向矢量数据的指针?
  • 文档是否混乱,让你不得不问?如果是,那到底有什么令人困惑的地方?
  • 只是出于好奇,但 std::basic_string 在 c++03 标准中也有数据方法(const 版本)。 const CharT* data() const;

标签: c++ c++11 vector


【解决方案1】:

不,begin 返回一个迭代器,而data 返回一个指针。对于给定的实现,这些可能是同一件事,但您不应该指望这一点。

【讨论】:

  • @alcedine 实际上这在 C++03 中得到了纠正。它只是 C++98 并且在此之前并不能保证它。
  • @alcedine,不正确。至少从 2003 年开始是连续的,我有一种强烈的感觉,它是 98 年的连续。
  • 现在很少有实现将迭代器作为指针。
  • @alcedine:你在想std::stringstd::vector 一直是连续的,因为它一直被设计为可用于 C 互操作的缓冲区的包装器。
  • 事实上,我在98标准中找不到任何规范要求向量是连续的......
【解决方案2】:

使用迭代器作为指针是完全错误的,因为它是实现定义的。如果您仍然需要在迭代器中指向数据的指针,您应该使用解引用迭代器的地址,如下所示:

std::vector<int> v; v.push_back(42);
std::vector<int>::iterator it = v.begin();
int * p = &*it;

当然,在 c++11 中,您可以使用 .data() 作为向量元素的指针。

【讨论】:

    【解决方案3】:

    prior-C++11 中的 std::vector::begin() 是否等同于 C++11 中的 std::vector::data()?

    取决于你所说的等价物是什么意思。解引用其中一个将产生对向量中第一项的引用,但不能保证 begin() 返回的迭代器可转换为 data() 返回的指针类型。

    我问这个的原因,早于 C++11,我曾经将 std::vector::begin() 视为指针,但在 C++11 之后,它不是,我不能转换为指针等效。

    您的代码能否顺利运行,取决于您如何看待它。

    那么,我可以在 C++11 之后使用 data() 代替吗?

    有两个迭代器对跨越向量的数据:

    begin()end()

    data()data() + size()

    您可以在任何标准算法中使用任何一种,结果都是一样的。

    作为一种良好的风格,您应该尽可能使用begin()end()(几乎总是这样)。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2021-08-20
      • 2013-05-07
      • 2013-01-29
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-07-03
      • 1970-01-01
      相关资源
      最近更新 更多