我需要显示使用合并排序算法排序的向量。但是,我的朋友使用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()完美运行。
假设v类型为的向量std::vector<int>。然后:
v[0]返回对第一个向量元素的引用,并且v不能为空(否则,行为未定义)。此表达式的类型为int&或const int&。
v.data()返回指向第一个向量元素的指针,或者返回一些未指定的指针值(如果v为空)。此表达式的类型为int*或const int*。
v.begin()返回第一个向量元素的迭代器,v.end()如果v为空。此表达式的类型为std::vector<int>::iterator或std::vector<int>::const_iterator。
merge_sort如您所料,作为指针的第一个参数,指针(int* a)在这三个表达式中只有v.data()一个合适的类型。当然,您也可以通过&v[0]和&*v.begin()。