C++ 向量v的v[0]、v.begin()和v.data()之间有什么区别?
我需要显示使用合并排序算法排序的向量。然而,我的朋友使用v.data传递向量,而我使用v.begin。 他的代码运行得很好,而我的代码运行得不好。请解释一下 我已经尝试通过v[0]和v.begin。它不起作用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;
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。