c++以泛型方式对对象类数组进行排序
c++ sort array of objects classes in generic way
晚上好,专家
我正在以通用的方式进行编程练习。我知道如何用不同的数据类型对不同的对象进行排序,但我很难对类进行排序
这是我的代码:
#include <iostream>
#include<string>
using namespace std;
class Employee
{
private:
int idNum;
string lastName;
int hireDate;
int verifyDate(int);
public:
Employee();
Employee(int,string,int);
void displayData();
void setLastName(string);
void setIdNum(int);
void setHireDate(int);
void setGradePointAverage(double);
};
Employee::Employee()
{
idNum=0;
lastName="";
hireDate=0;
}
Employee::Employee(int idNum, string lastName, int hireDate)
{
this->idNum=idNum;
this->lastName=lastName;
this->hireDate=hireDate;
}
void Employee::displayData()
{
cout<<"nEmployee Data:";
cout<<"nID: "<<idNum;
cout<<"nLastName: "<<lastName;
cout<<"nHireDate: "<<hireDate;
}
void Employee::setLastName(string lastName)
{
this->lastName=lastName;
}
void Employee::setIdNum(int idNum)
{
this->idNum=idNum;
}
void Employee::setHireDate(int hireDate)
{
this->hireDate=hireDate;
}
void Employee::setGradePointAverage(double grade)
{
double new_grade;
new_grade=grade;
}
template <class T>
void selectionSort (T data[], int n){
T temp;
for(int i=0, j, least; i < n-1; i++){
for( j = i+1, least = i; j < n; j++ ){
if ( data[j] < data[least]){
least = j;
}
}
temp = data[least];
data[least] = data[i];
data[i] = temp;
}
}
int main()
{
Employee e[3];
e[0].setIdNum(337322);
e[1].setIdNum(3539854);
e[2].setIdNum(1224567);
e[0].setLastName("Marlen");
e[1].setLastName("Oleg");
e[2].setLastName("Test");
e[0].setHireDate(25061989);
e[1].setHireDate(30001990);
e[2].setHireDate(12122012);
for (int i=0; i<3;i++)
{
e[i].displayData();
cout<<"n";
}
selectionSort(e,3);
return 0;
}
当我调用selectionSort函数时,编译器会给我以下错误:
Error 1 error C2784: 'bool std::operator <(const std::basic_string<_Elem,_Traits,_Alloc> &,const _Elem *)' : could not deduce template argument for 'const std::basic_string<_Elem,_Traits,_Alloc> &' from 'Employee' c:usersgulmiradocumentsvisual studio 2010projectscsci203_lab1csci203_lab1task6.cpp 74
Error 2 error C2784: 'bool std::operator <(const _Elem *,const std::basic_string<_Elem,_Traits,_Alloc> &)' : could not deduce template argument for 'const _Elem *' from 'Employee' c:usersgulmiradocumentsvisual studio 2010projectscsci203_lab1csci203_lab1task6.cpp 74
Error 3 error C2784: 'bool std::operator <(const std::basic_string<_Elem,_Traits,_Alloc> &,const std::basic_string<_Elem,_Traits,_Alloc> &)' : could not deduce template argument for 'const std::basic_string<_Elem,_Traits,_Alloc> &' from 'Employee' c:usersgulmiradocumentsvisual studio 2010projectscsci203_lab1csci203_lab1task6.cpp 74
请提出如何解决这个问题的想法,感谢提前
正如错误所指出的,Employee
没有operator<
,但您正试图在排序函数中使用它
您需要选择一个订购条件(例如按员工id编号),并相应地实现operator<
。
例如:
bool Employee::operator<(const Employee& rhs) const {
return idNum < rhs.idNum;
}
如果你想让调用者选择排序标准,你可以像std::sort()
一样,允许传递一个用于比较的函子或函数指针:
template <class T, class Comp>
void selectionSort (T data[], int n, Comp comp){
// ...
if (comp(data[j], data[least])) {
// ...
然后你可以这样使用:
bool orderEmployeesByLastName(const Employee& a, const Employee& b) {
return std::lexicographical_compare(
a.getLastName().begin(), a.getLastName.end(),
b.getLastName().begin(), b.getLastName.end());
}
// ...
selectionSort(e, 3, &orderEmployeesByLastName);
您需要实现<员工类的操作员。不要指望编译器知道如何为你做这件事。你需要告诉它你希望那个操作符为类做什么。
相关文章:
- 显示错误输出的简单数组排序程序
- C 使用单个函数对具有多种值类型的数组排序
- 2D数组排序,空格打乱顺序
- C 2D数组排序
- C++数组排序 - 将"bbba"和"0001"视为不正确排序的问题
- 数组排序功能
- CString 数组排序
- 简单的数组排序/检查 划分和征服版本
- C++ 中的多维数组排序
- 选择在++中对并行数组排序
- C++:二维指针数组排序:选择排序不适用于某些实例
- C++字符串数组排序
- C++中的指针数组排序算法
- 在VC++6中使用向量进行数组排序时出错,而在VC++2012中没有错误
- 将索引数组排序为主数组
- 数组排序、数组输入、数组输出
- C++数组排序,内存错误
- 在嵌入式系统上将数组排序功能从c++移植到c
- 基于其他int数组排序
- 多维数组排序c++奇怪行为