C++ QVector故障<;T>;::接线员[]:“;“索引超出范围”;意外抛出

C++ QVector故障<;T>;::接线员[]:“;“索引超出范围”;意外抛出,c++,qt,sorting,vector,indexoutofrangeexception,C++,Qt,Sorting,Vector,Indexoutofrangeexception,我有两种排序方法:插入排序和shell排序。其中两个工作函数我从C中适应C++。问题是,IsSoTo排序函数工作正常,Seull排序失败。这可能是什么原因 bool less(QVector<int> &arr, int a, int b) { return arr[a] < arr[b]; } // Performs swap on elements at a and b in QVector<int> a

我有两种排序方法:插入排序和shell排序。其中两个工作函数我从C中适应C++。问题是,IsSoTo排序函数工作正常,Seull排序失败。这可能是什么原因

    bool less(QVector<int> &arr, int a, int b)
    {
        return arr[a] < arr[b];
    }

    // Performs swap on elements at a and b in QVector<int> arr
    void qswap(QVector<int> &arr, int a, int b)
    {
        int temp = arr[a];
        arr[a] = arr[b];
        arr[b] = temp;
    }

    /* Failure is thrown in this method */
    void shell_sort(GraphicsView &window, SwapManager &manager)
    {
        auto list = window.items();
        QVector<int> arr;
        for (auto item : list)
            arr.push_back(static_cast<QGraphicsRectWidget*>(item)->m_number);
        int N = arr.size();
        int h = 1;
        while (h < N/3) h = 3*h  + 1;
        while (h >= 1)
        {
            for (int i = h; i < N; ++i)
            {
                for (int j = i; less(arr, j, j-h) && j >= h; j -= h)
                {
                    qswap(arr, j, j-h);
                    manager.addPair(j, j - h);
                }
            }
            h /= 3;
        }
    }
bool-less(QVector&arr,int a,int b)
{
返回arr[a]m_编号);
int N=阵列大小();
int h=1;
而(h=1)
{
对于(int i=h;i=h;j-=h)
{
qswap(arr,j,j-h);
addPair(j,j-h);
}
}
h/=3;
}
}
那一个做得很好

    /* This method works just fine */
    void ins_sort(GraphicsView &window, SwapManager &manager)
    {
        auto list = window.items();
        int i, j;
        QVector<int> arr;

        for (auto item : list)
        {
            arr.push_back(static_cast<QGraphicsRectWidget*>(item)->m_number);
        }
        int N = arr.size();
        for (i = 1; i < N; ++i)
        {
            for (j = i - 1; j != -1 && less(arr, j + 1, j); --j)
            {
                qswap(arr, j, j + 1);
                manager.addPair(j, j + 1);
            }
        }
    }
/*此方法效果很好*/
无效ins_排序(图形视图和窗口、SwapManager和管理器)
{
自动列表=window.items();
int i,j;
qv-arr;
用于(自动项目:列表)
{
arr.push_back(静态铸件(项目)->m_编号);
}
int N=阵列大小();
对于(i=1;i
调试器在“qvector.h”中指向这段代码

Q_断言X(i>=0&&isize,“QVector::operator[]”,“索引超出范围”);
返回数据()[i];}

在for循环条件下,在比较项目之前检查j值是有意义的:

for (int j = i; j >= h && less(arr, j, j-h); j -= h)
for (int j = i; j >= h && less(arr, j, j-h); j -= h)