向量下标超出范围C ++合并排序

时间:2018-03-10 12:56:36

标签: c++ algorithm vector mergesort

我正在尝试在c ++中实现一个简单的合并排序,但我一直在遇到这个错误:

enter image description here

我的代码:

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);
}
}

在main中调用:mergeSort(numbers,0,numbers.size());其中number是带有一些数字的向量。

如何解决这个断言失败以及矢量下标超出范围意味着什么?

1 个答案:

答案 0 :(得分:0)

编程规则是坏代码包含错误。:)

对于初学者,您应该使用std::vector<int>::size_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]);
}

在循环之后,向量元素的数量比实际的元素数量大一个。

考虑以下使用函数merge中的循环的测试程序。

#include <iostream>
#include <vector>

void merge( std::vector<int> &data,  
            std::vector<int>::size_type left,
            std::vector<int>::size_type mid,
            std::vector<int>::size_type right ) 
{
    std::vector<int> L, R;

    for ( std::vector<int>::size_type i = 0; i <  mid - left + 1; i++ ) 
    {
            L.push_back( data[left + i] );
    }

    for ( std::vector<int>::size_type j = 0; j < right - mid; j++ ) 
    {
            R.push_back( data[mid + j + 1]);
    }

    std::cout << L.size() << '\t' << R.size() << std::endl;
}

void mergeSort( std::vector<int> &v, 
                std::vector<int>::size_type left, 
                std::vector<int>::size_type right ) 
{
    if ( left < right ) 
    {
        auto mid = ( left + right ) / 2;
        merge( v, left, mid, right );
    }
}

int main() 
{
    std::vector<int> v( { 1, 2 } );

    mergeSort( v, 0, v.size() );

    return 0;
}

它的输出是

2   1

虽然原始向量v仅包含2元素。