Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/162.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
向量下标超出范围C++;合并排序 我试图在C++中实现一个简单的合并排序,但是我一直在执行这个错误:_C++_Algorithm_Vector_Mergesort - Fatal编程技术网

向量下标超出范围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