Visual Studio在此选择排序上引发了大量调试错误

时间:2017-01-04 19:30:58

标签: c++ visual-studio vector

所以我最近从Java切换到了C ++,并且正在构建一个选择排序的例子,作为一种更好地了解Vector库的方法。但是,当我尝试运行程序时,没有构建错误,但有两个调试错误。

enter image description here

enter image description here

点击忽略后,我收到了大量警告:

enter image description here

我仍然是C ++的新手所以我不知道是什么导致了这些错误,我们将非常感谢任何帮助。这是我写的代码,提前谢谢你。如果您想了解更多信息,请询问,我将提供所需的信息。

#include <stdlib.h>
#include <vector>
#include <iostream>
using namespace std;

int findLowest(vector<int> in) {

    int min = in[0];
    int index = 0;

    for (int i = 1; i < in.size(); i++) {
        if (in[i] < min) {
            min = in[i];
            index = i;
        }
    }

    return index;
}

void printVector(vector<int> in) {
    vector<int>::iterator v = in.begin();
    while (v != in.end()) {
        cout << *v << endl;
        v++;
    }
}

vector<int> selectionSort(vector<int> toSort) {
    vector<int> temp;

    for (int i = 0; i < toSort.size(); i++) {
        int tempIndex = findLowest(toSort);
        temp.push_back(toSort[tempIndex]);
        temp.erase(temp.begin() + tempIndex);
    }

    return temp;
}

vector<int> randomArray(int size) {
    vector<int> temp;
    for (int i = 0; i < size; i++) {
        temp.push_back(rand() % 100);
    }
    return temp;
}

void main() {
    vector<int> toSort = randomArray(20);
    printVector(toSort);

    vector<int> sorted = selectionSort(toSort);
    printVector(sorted);

    cin.ignore();
}

2 个答案:

答案 0 :(得分:4)

点击中断,以便它可以显示程序遇到错误的位置。

它会显示调用堆栈: enter image description here

双击不显示的行(您的代码)。

然后您将看到您的代码,您可以添加一些数据视图(或添加手表,或只是用鼠标悬停): enter image description here

从这里您可以看到temp向量的大小为1,但tempIndex变量的值为3,这意味着对erase()的调用超出了范围如上所述的错误消息。

答案 1 :(得分:2)

您的selectionSort功能很奇怪,我会使用std::sort

无论如何,替换:

for (int i = 0; i < toSort.size(); i++) {
    int tempIndex = findLowest(toSort);
    temp.push_back(toSort[tempIndex]);
    temp.erase(temp.begin() + tempIndex);
}

由:

size_t size = toSort.size();
for (size_t i = 0; i < size; i++) {
    int tempIndex = findLowest(toSort);
    temp.push_back(toSort[tempIndex]);
    toSort.erase(toSort.begin() + tempIndex);
}

修复您的seg错误并对容器进行排序。

请注意,通过在变量中保存大小,您可以确保执行20次迭代...而不是10次...

另外,正如Adrian size_t(无符号)所评论的那样也应该使用而不是intfindLowest的相同评论)

下次使用调试器时,应该很容易通过这样做来发现...; - )