向量 v 的 v[0]、v.begin() 和 v.data() 有啥区别?

Posted

技术标签:

【中文标题】向量 v 的 v[0]、v.begin() 和 v.data() 有啥区别?【英文标题】:What is the difference between v[0], v.begin() and v.data() of a vector v?向量 v 的 v[0]、v.begin() 和 v.data() 有什么区别? 【发布时间】:2019-10-19 14:12:41 【问题描述】:

我需要显示使用归并排序算法排序的向量。但是,我的朋友使用 v.data() 来传递向量,而我使用 v.begin()。 他的代码运行良好,而我的代码却没有。请解释一下。

我已经尝试过传递 v[0] 和 v.begin()。它不起作用。

void merge_sort(int *a, int i, int j);

void merge_sort(int *a, int i, int j) 

    int mid;

    if (i < j) 
        mid = (i + j) / 2;

        merge_sort(a, i, mid);       // left recursion

        merge_sort(a, mid + 1, j);   // right recursion

        merge(a, i, mid, mid + 1, j); 
    


int main() 


    int num;
    cout << "Enter array length (n) = ";
    cin >> num;

    vector<int> a(num);

    cout << "Enter the number:" << endl;
    for (int i = 0; i < num; i++)
        cin >> a[i];

    merge_sort(a.data(), 0, num - 1);

    cout << "\nSorted array :\n";
    for (int i = 0; i < num; i++)
        cout << a[i] << " ";

    cout << endl;
    return 0;

v.begin() 和 v[0] 显示错误,而 v.data() 工作正常。

【问题讨论】:

欢迎来到 Stack Overflow Farhan! :) merge() 方法的定义在哪里? 如果容器为空,v[0] 无效(越界)。对于v.begin(),它本身是有效的,但如果容器为空,取消引用迭代器无效。 【参考方案1】:

假设一个向量v 的类型为std::vector&lt;int&gt;。那么:

v[0] 返回第一个向量元素的引用v 不能为空(否则,行为未定义)。此表达式的类型为int&amp;const int&amp;

v.data() 返回一个指向第一个向量元素的 指针,如果 v 为空,则返回一些未指定的指针值。此表达式的类型为int*const int*

v.begin() 返回一个 iterator 到第一个向量元素,如果v 为空,则返回v.end()。此表达式的类型为std::vector&lt;int&gt;::iteratorstd::vector&lt;int&gt;::const_iterator

由于您的 merge_sort 期望指针 (int* a) 作为其第一个参数,因此在这三个表达式中,只有 v.data() 具有合适的类型。当然,你也可以通过&amp;v[0]&amp;*v.begin()

【讨论】:

v.data()可以为空 虽然您可能会回答问题的标题,但我不知道您是否真的帮助了 OP(也是一个新的贡献者),我的意思是如果我是几年前的 OP,我不是确定我是否会从这个答案中得到一切.. 编辑:是的,现在你的答案已经改进了,太棒了! :) 我认为 v[0] 在 v 为空时也有未定义的行为,因为它不需要检查边界。 @churill 是的,it has.【参考方案2】:

v.data() :返回指向向量内部用于存储其拥有的元素的内存数组的直接指针

v[0] : vetcor 的第一个元素

v.begin() : 将迭代器返回到向量的第一个元素

你的函数void merge_sort(int *a, int i, int j); 取指针.. 所以v.data() 工作正常..

【讨论】:

以上是关于向量 v 的 v[0]、v.begin() 和 v.data() 有啥区别?的主要内容,如果未能解决你的问题,请参考以下文章

超过向量不会导致段错误

优化向量赋值 c++

通过引用传递向量内联

C++:遍历向量的向量

C++中向量初始化的性能

如何在向量的给定索引范围内找到最小元素?