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

0 c++ stl vector

我需要显示使用合并排序算法排序的向量。但是,我的朋友使用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;
}
Run Code Online (Sandbox Code Playgroud)

v.begin()和v [0]显示错误,而v.data()完美运行。

Dan*_*ica 6

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

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

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

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

merge_sort如您所料,作为指针的第一个参数,指针(int* a)在这三个表达式中只有v.data()一个合适的类型。当然,您也可以通过&v[0]&*v.begin()

  • 对于“v.data()”它可以为空 (2认同)