【发布时间】:2020-10-07 04:20:08
【问题描述】:
我正在尝试使用 C++ 中的向量实现归并排序,这是我正在执行的以下代码:
#include <iostream>
#include <vector>
using namespace std;
void merge(vector<int> &a, int l, int m, int r) {
int i, j, k;
int n1 = m - l + 1;
int n2 = r - m;
int L[n1], R[n2];
for (i = 0; i < n1; i++) {
L[i] = a[l + i];
}
for (j = 0; j < n2; j++) {
L[j] = a[m + 1 + j];
}
i = 0;
j = 0;
k = l; //merged array
while (i < n1 && j < n2) {
if (L[i] <= R[j]) {
a[k] = L[i];
i++;
} else {
a[k] = R[j];
j++;
}
k++;
}
while (i < n1) {
a[k] = L[i];
i++;
k++;
}
while (j < n2) {
a[k] = R[j];
j++;
k++;
}
}
void mergeSort(vector<int> &a, int l, int r) {
if (l < r) {
int m = l + (r - l) / 2;
mergeSort(a, l, m);
mergeSort(a, m + 1, r);
merge(a, l, m, r);
}
}
int main() {
int n;
std::cin >> n;
vector<int> a(n);
for (int i = 0; i < a.size(); i++) {
cin >> a[i];
}
mergeSort(a, 0, a.size() - 1);
for (int i = 0; i < a.size(); i++) {
cout << a[i];
}
}
当我执行此操作并输入任何值时,我会在数组中返回垃圾值a[i] = 7405024,由于我无法就地更改向量的值或者是还有其他的。
【问题讨论】:
-
使用调试器逐行检查程序并在每一步检查变量的内容。准确找出变量内容开始与预期不同的位置和时间。
-
无论哪本 C++ 教科书教你写“
int L[n1],R[n2];”,都请扔掉,换一本更好的 C++ 教科书。这不是标准的 C++。除此之外,是的,这就是调试器的用途。使用调试器遍历程序,一次一行,检查所有变量的值,并观察它们的变化。这是您可以证明您的假设的唯一方法,即您的“主要问题”是什么。 -
不,@Yasir,至少使用
size()的部分是正确的。为什么你认为应该在这里使用capacity()? -
大概
L[j]=a[m+1+j];应该是R[j]=a[m+1+j]; -
@Yasir
std::vector<int> myVector(5);声明了一个包含 5 个元素(又名size()==5)和未指定容量的向量。元素已经存在,OP 只是在改变它们。使用capacity()仅在您将push_back其中一些并且您不想或不能创建默认对象时才有意义。