【问题标题】:What is difference between begin() and data()begin() 和 data() 有什么区别
【发布时间】:2020-11-07 07:05:58
【问题描述】:

begin()data() 都返回指向第一个元素的迭代器。但是,data() 的定义说它返回一个指向内存数组的直接指针,该内存数组由向量内部用于存储其拥有的元素。我也可以使用它们来访问任何元素。那么,两者有什么不同呢?考虑下面的例子,

#include <iostream>
#include <vector>

int main() {
    std::vector<int> v;
    v.reserve(5);

    for (int i = 1; i <= 5; i ++) v.push_back(i);
    
    auto it = v.begin();
    auto pos = v.data();

    std::cout << "First element : " << *it << std::endl;
    std::cout << "First element : " << *pos << std::endl;

    std::cout << "Third element : " << it[2] << std::endl;
    std::cout << "Third element : " << pos[2] << std::endl;
}

【问题讨论】:

  • 你错了。这些方法中只有一个返回迭代器。另一个没有。
  • @SamVarshavchik 从某种角度来看,OP 实际上并没有错。指针是有效的迭代器。迭代器旨在模仿指针。所以,从这个意义上说,begin()data() 都将迭代器返回到第一个元素,只是迭代器类型不同。

标签: c++ vector stl


【解决方案1】:
std::vector::begin()

v.begin() 返回一个 iterator 引用向量中的第一个元素。

std::vector::data()

v.data() 返回一个指针,指向向量内部使用的数组中的第一个元素。

【讨论】:

    【解决方案2】:

    所有容器类型都有一个iterator,但只有一些容器类型是连续的并支持data()。例如,

    vector<int> v;
    copy(v.begin(), v.end(), ostream_iterator<int>(cout, "\n"));
    v.data(); // ok
    
    list<int> l;
    copy(l.begin(), l.end(), ostream_iterator<int>(cout, "\n"));
    l.data(); // no
    

    确实,来自int* vector&lt;int&gt;::data()int* 满足iterator_traits&lt;int*&gt;::iterator_category == random_access_iterator_tag,并且vector&lt;int&gt;::iterator 可以实现为int*。但是,该标准并没有强制要求,并且使用类似的东西实现vector&lt;int&gt;::iterator 是合法的

    class vector<T> {
        class iterator {
            vector<T>* v;
            vector<T>::size_type pos;
        };
    };
    

    因此,如果没有data(),您必须使用&amp;v[0]&amp;*v.front() 之类的技巧来访问支持vector 的底层连续内存。这是 C++11 引入 data() 之前的状态。

    【讨论】:

      猜你喜欢
      • 2020-09-22
      • 1970-01-01
      • 1970-01-01
      • 2020-12-03
      • 2015-09-21
      • 1970-01-01
      • 1970-01-01
      • 2015-10-14
      • 1970-01-01
      相关资源
      最近更新 更多