【问题标题】: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(),它本身是有效的,但如果容器为空,取消引用迭代器无效。

标签: c++ vector stl


【解决方案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() 工作正常..

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2019-04-18
    • 2021-09-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-01-23
    • 1970-01-01
    相关资源
    最近更新 更多