我需要显示使用合并排序算法排序的向量。但是,我的朋友使用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<int>
。然后:
v[0]
返回第一个向量元素的reference,并且v
不能为空(否则,行为未定义)。此表达式的类型为int&
或const int&
。
v.data()
返回第一个矢量元素的pointer,如果v
为空,则返回一些未指定的指针值。此表达式的类型为int*
或const int*
。
v.begin()
返回第一个矢量元素的iterator,如果v.end()
为空,则返回v
。此表达式的类型为std::vector<int>::iterator
或std::vector<int>::const_iterator
。
由于merge_sort
期望将指针(int* a
)作为第一个参数,所以在这三个表达式中,只有v.data()
具有合适的类型。当然,您也可以传递&v[0]
和&*v.begin()
。
v.data()
:返回指向指针的直接指针,该指针在向量内部用于存储其拥有的元素]
v[0]
:vetcor的第一个元素
v.begin()
:将迭代器返回到向量的第一个元素
您的功能void merge_sort(int *a, int i, int j);
获取指针。因此v.data()
可以正常工作。