向量v的v [0],v.begin()和v.data()之间有什么区别?

问题描述 投票:0回答:2

我需要显示使用合并排序算法排序的向量。但是,我的朋友使用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()完美运行。

c++ vector stl
2个回答
5
投票

假设类型为v的向量std::vector<int>。然后:

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

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

  • v.begin()返回第一个矢量元素的iterator,如果v.end()为空,则返回v。此表达式的类型为std::vector<int>::iteratorstd::vector<int>::const_iterator

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


1
投票

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

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

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

您的功能void merge_sort(int *a, int i, int j);获取指针。因此v.data()可以正常工作。

© www.soinside.com 2019 - 2024. All rights reserved.