向量下标超出范围C++;合并排序 我试图在C++中实现一个简单的合并排序,但是我一直在执行这个错误:
我的代码:向量下标超出范围C++;合并排序 我试图在C++中实现一个简单的合并排序,但是我一直在执行这个错误:,c++,algorithm,vector,mergesort,C++,Algorithm,Vector,Mergesort,我的代码: void merge(vector<int> &data,int left,int mid,int right) { vector<int> L, R, v; int i, j; for (i = 0; i < mid - left + 1; i++) { L.push_back(v[left + i]); } for (j = 0; j < right - mid; j++) { R.push_back(v[mid +
void merge(vector<int> &data,int left,int mid,int right) {
vector<int> L, R, v;
int i, j;
for (i = 0; i < mid - left + 1; i++) {
L.push_back(v[left + i]);
}
for (j = 0; j < right - mid; j++) {
R.push_back(v[mid + j + 1]);
}
i = j = 0;
int k = left;
while (i < L.size() && j < R.size()) {
if (L[i] < R[j]) {
v[k++] = L[i++];
}
else {
v[k++] = R[j++];
}
}
while (i < L.size()) {
v[k++] = L[i++];
}
while (j < R.size()) {
v[k++] = R[j++];
}
vector<int>::const_iterator iter = v.begin();
for (; iter != v.end(); ++iter)
{
data[left++] = *iter;
}
}
void mergeSort(vector<int> &v, int left, int right) {
if (left < right) {
int mid = (left + right) / 2;
mergeSort(v, left, mid);
mergeSort(v, mid + 1, right);
merge(v, left, mid, right);
}
}
void合并(向量和数据、左整数、中整数、右整数){
向量L,R,v;
int i,j;
对于(i=0;i
在main中调用:mergeSort(numbers,0,numbers.size())代码>其中数字是包含一些数字的向量
如何解决此断言失败以及向量下标超出范围意味着什么?是一条编程法则,错误代码包含错误。:)
对于初学者,应该使用类型std::vector::size\u type
而不是类型int
函数“合并”中存在输入错误。显然,由于向量v
为空,因此必须在循环中使用向量data
,而不是向量v
void merge(vector<int> &data,int left,int mid,int right) {
vector<int> L, R, v;
int i, j;
for (i = 0; i < mid - left + 1; i++) {
L.push_back(v[left + i]);
}
for (j = 0; j < right - mid; j++) {
R.push_back(v[mid + j + 1]);
}
它的产量是
2 1
虽然原始向量v
只包含2
元素。这是一个崩溃。您可以使用调试器来找出它发生在代码中的什么地方,并检查涉及的变量以确保它们看起来正常。因此,从按下“重试”按钮开始调试,进入调试器。也就是说,“向量下标超出范围”消息应该是一个关于发生了什么的非常大的提示。这是一个很好的起点。@Raul Marinau错误的原因是函数merge的代码非常糟糕。编程的一条规则是坏代码中包含bug。@Raul Marinau至少在函数merge中有输入错误。循环中必须有向量数据,而不是向量v。对于(i=0;i2 1