向量 v 的 v[0]、v.begin() 和 v.data() 有啥区别?
Posted
技术标签:
【中文标题】向量 v 的 v[0]、v.begin() 和 v.data() 有啥区别?【英文标题】: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()
,它本身是有效的,但如果容器为空,取消引用迭代器无效。
【参考方案1】:
假设一个向量v
的类型为std::vector<int>
。那么:
v[0]
返回第一个向量元素的引用,v
不能为空(否则,行为未定义)。此表达式的类型为int&
或const int&
。
v.data()
返回一个指向第一个向量元素的 指针,如果 v
为空,则返回一些未指定的指针值。此表达式的类型为int*
或const int*
。
v.begin()
返回一个 iterator 到第一个向量元素,如果v
为空,则返回v.end()
。此表达式的类型为std::vector<int>::iterator
或std::vector<int>::const_iterator
。
由于您的 merge_sort
期望指针 (int* a
) 作为其第一个参数,因此在这三个表达式中,只有 v.data()
具有合适的类型。当然,你也可以通过&v[0]
和&*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()
工作正常..
【讨论】:
以上是关于向量 v 的 v[0]、v.begin() 和 v.data() 有啥区别?的主要内容,如果未能解决你的问题,请参考以下文章