所以我最近从Java切换到了C ++,并且正在构建一个选择排序的例子,作为一种更好地了解Vector库的方法。但是,当我尝试运行程序时,没有构建错误,但有两个调试错误。
点击忽略后,我收到了大量警告:
我仍然是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();
}
答案 0 :(得分:4)
点击中断,以便它可以显示程序遇到错误的位置。
双击不显示的行(您的代码)。
然后您将看到您的代码,您可以添加一些数据视图(或添加手表,或只是用鼠标悬停):
从这里您可以看到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
(无符号)所评论的那样也应该使用而不是int
(findLowest
的相同评论)
下次使用调试器时,应该很容易通过这样做来发现...; - )