我正在尝试对员工记录进行排序。此记录包含包含名字,姓氏和员工年龄的条目。除了某些输入语句(在main函数中作为注释给出)之外,整个程序运行正常。该计划如下: -
#include<iostream>
#include<vector>
#include<string>
using namespace std;
class cPerson
{
private:
string firstname,lastname;
int age;
public:
cPerson(string fn,string ln,int a) // constructor to input the firstname, lastname and age of the person
{
firstname=fn;
lastname=ln;
age=a;
}
void display()
{
cout<<"First Name = "<<firstname<<"\n";
cout<<"Last Name = "<<lastname<<"\n";
cout<<"Age = "<<age<<"\n";
}
int getAge()
{
return age;
}
string getLastName()
{
return lastname;
}
};
class cOffice
{
private:
vector<cPerson*> v;
int nElem; // counter of number of elements in the vector;
public:
cOffice(int max)
{
v.resize(max); // maximum capacity of the vector
nElem=0;
}
~cOffice()
{
for(int i=0;i<nElem;i++)
delete v[i];
}
void insertRec(string fn1, string ln1, int a1) // inserting the record
{
v[nElem] = new cPerson(fn1,ln1,a1);
nElem++;
}
void InsertionSort()
{
int compare,pivot;
for(pivot=1;pivot<nElem;pivot++)
{
cPerson* temp = v[pivot];
for(compare=pivot;v[compare-1]->getAge()>temp->getAge();compare--)
{
v[compare]=v[compare-1];
}
v[compare] = temp;
}
}
void display()
{
for(int i=0;i<nElem;i++)
v[i]->display();
}
};
int main(void)
{
cOffice obj(10);
obj.insertRec("Evans", "Patty", 24);
obj.insertRec("Adams", "Henry", 63);
obj.insertRec("Yee", "Tom", 43);
obj.insertRec("Smith", "Lorraine", 37);
/*obj.insertRec("Hashimoto", "Sato", 21); // cause of the crash
obj.insertRec("Stimson", "Henry", 29);
obj.insertRec("Velasquez", "Jose", 72);
obj.insertRec("Lamarque", "Henry", 54);
obj.insertRec("Vang", "Minh", 22);
obj.insertRec("Creswell", "Lucinda", 18);*/
obj.display();
obj.InsertionSort();
obj.display();
return 0;
}
问题是前四个输入语句工作得很好(按我输入的任何顺序)。这表明我的InsertionSort()函数工作正常(是吗?)。我想知道我在程序中做错了什么。谢谢你的帮助。
更正后的InsertionSort功能(如MM-BB所示)如下: -
void InsertionSort()
{
int compare,pivot;
for(pivot=1;pivot<nElem;pivot++)
{
cPerson* temp = v[pivot];
for(compare=pivot;compare>0&&v[compare-1]->getAge()>temp->getAge();compare--)
{
v[compare]=v[compare-1];
}
v[compare] = temp;
}
}
更正是在第二个for语句中的条件之前添加了术语compare>0 &&
。这确保vector v
保持在界限范围内。早些时候,情况并非如此导致v [-1]未被定义,从而导致程序崩溃。
答案 0 :(得分:1)
for(compare=pivot;v[compare-1]->getAge()>temp->getAge();compare--)
假设pivot
为1
,compare
为1
。然后,您可以访问列表0
中的元素v
。如果年龄较大,您将减少比较,这使您可以访问越界元素(v[-1]
)。
答案 1 :(得分:0)
您的功能必须compare > 0
两种方式存在,其中一种是真的
way 1
void InsertionSort()
{
int compare,pivot;
for(pivot=1;pivot<nElem;pivot++)
{
cPerson* temp = v[pivot];
for(compare=pivot; compare > 0 && v[compare-1]->getAge()>temp->getAge();compare--)
{
v[compare]=v[compare-1];
}
v[compare] = temp;
}
}
way 2
void InsertionSort()
{
int compare,pivot;
for(pivot=1;pivot<nElem;pivot++)
{
cPerson* temp = v[pivot];
for(compare=pivot; v[compare-1]->getAge()>temp->getAge() && compare>0 ;compare--)
{
v[compare]=v[compare-1];
}
v[compare] = temp;
}
}
way 1
为真,但way 2
为假
当compare == 0
然后v[index-1]
发布问题时,请注意
我们必须先检查compare > 0