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

C++ 向量v的v[0]、v.begin()和v.data()之间有什么区别?,c++,vector,stl,C++,Vector,Stl,我需要显示使用合并排序算法排序的向量。然而,我的朋友使用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;

我需要显示使用合并排序算法排序的向量。然而,我的朋友使用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工作正常。

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

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

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

v、 begin将迭代器返回到第一个向量元素,如果v为空,则返回v.end。此表达式的类型是std::vector::iterator或std::vector::const_iterator

由于merge_排序的第一个参数是指针int*a,因此在这三个表达式中,只有v.data具有合适的类型。当然,您也可以通过&v[0]和&v.begin

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

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

v、 开始:将迭代器返回到向量的第一个元素

函数void merge_sortint*a,int i,int j;拿着指针。。
所以v.data工作正常。

欢迎来到Stack Overflow Farhan!:合并方法的定义在哪里?如果容器为空,则v[0]无效,超出范围。对于v.begin,这本身是有效的,但是如果容器是空的,则取消对迭代器的引用是无效的。对于v.data,迭代器可以是空的。虽然您可以回答问题的标题,但我不知道您是否真的帮助OP成为了一个新的贡献者,我的意思是,如果几年前我是OP,我不确定我是否能从这个答案中获得一切。。编辑:是的,现在你的答案提高了,好极了我认为v[0]在v为空时也有未定义的行为,因为它不需要检查边界。@churill Yes。