C++中istream重载实现、ostream输出及升序排序算法咨询
员工数据读取、输出与排序问题全解
嗨,咱们一步步来修正你的代码,同时解答你提出的所有问题:
一、先修正istream运算符重载的错误
你的现有重载代码有两个明显问题:
int pay = atoi(payrollStuff);这行完全多余,而且在读取数据到payrollStuff之前就调用atoi,此时数组未初始化,会导致未定义行为,直接删掉即可。- 读取逻辑需要确保每次
getline都能正确获取对应字段。假设你的Project3.dat文件格式是每行一个字段(姓名、员工ID、时薪、工时各占一行),修正后的重载代码如下:
istream& operator >> (istream& is, Employees& payroll) { char payrollStuff[256]; // 读取姓名 if (is.getline(payrollStuff, sizeof(payrollStuff))) { payroll.employeeName = payrollStuff; } // 读取员工ID if (is.getline(payrollStuff, sizeof(payrollStuff))) { payroll.employeeID = payrollStuff; } // 读取时薪并转换为int if (is.getline(payrollStuff, sizeof(payrollStuff))) { payroll.rate = atoi(payrollStuff); } // 读取工时并转换为int if (is.getline(payrollStuff, sizeof(payrollStuff))) { payroll.hours = atoi(payrollStuff); } return is; }
如果你的文件是用空格/制表符分隔字段(比如一行包含姓名、ID、rate、hours),那可以简化为直接用is读取(注意:如果姓名包含空格,这种方式不适用,还是要用getline):
istream& operator >> (istream& is, Employees& payroll) { is >> payroll.employeeName >> payroll.employeeID >> payroll.rate >> payroll.hours; return is; }
二、用ostream运算符重载实现员工信息输出
要输出员工信息,你可以重载ostream& operator<<,把员工的各个字段格式化输出。代码如下:
#include <iomanip> // 用于格式化输出(可选,让排版更美观) ostream& operator << (ostream& os, const Employees& payroll) { os << "员工姓名: " << payroll.employeeName << endl << "员工ID: " << payroll.employeeID << endl << "时薪: " << payroll.rate << " 元/小时" << endl << "工时: " << payroll.hours << " 小时" << endl << "-------------------------" << endl; return os; }
之后在main函数里,读取完数据后就可以直接输出:
for (int i = 0; i < SIZE; i++) { cout << payroll_size[i]; }
三、其他输出员工信息的方式
如果不想用运算符重载,还有两种常见的替代方案:
成员函数输出:给
Employees结构体添加一个print成员函数:struct Employees { string employeeName; string employeeID; int rate; int hours; void print() const { cout << "员工姓名: " << employeeName << endl << "员工ID: " << employeeID << endl << "时薪: " << rate << " 元/小时" << endl << "工时: " << hours << " 小时" << endl << "-------------------------" << endl; } };使用时直接调用:
payroll_size[i].print();全局函数输出:写一个独立的函数接收
Employees对象并输出:void printEmployee(const Employees& payroll) { cout << "员工姓名: " << payroll.employeeName << endl << "员工ID: " << payroll.employeeID << endl << "时薪: " << payroll.rate << " 元/小时" << endl << "工时: " << payroll.hours << " 小时" << endl << "-------------------------" << endl; }使用时:
printEmployee(payroll_size[i]);
四、员工信息升序排序的最优算法
在C++中,最优的排序方式是使用标准库的std::sort函数(定义在<algorithm>头文件中)。std::sort底层实现是Introsort(内省排序),结合了快速排序、堆排序和插入排序的优点,平均时间复杂度为O(n log n),是工业界广泛使用的高效排序算法。
要使用std::sort,你需要定义排序规则,有两种常用方式:
方式1:重载Employees的<运算符
如果需要固定的排序规则(比如按姓名升序),可以直接重载<运算符:
bool operator < (const Employees& a, const Employees& b) { // 这里以按员工姓名升序为例,你可以换成按ID、时薪或工时排序 return a.employeeName < b.employeeName; }
然后在main中调用:
#include <algorithm> // 必须包含这个头文件 // 读取完数据后执行排序 sort(payroll_size, payroll_size + SIZE);
方式2:使用lambda表达式(灵活适配临时排序规则)
如果不想重载运算符,或者需要不同的排序规则,可以在调用sort时传入lambda:
// 按工时升序排序 sort(payroll_size, payroll_size + SIZE, [](const Employees& a, const Employees& b) { return a.hours < b.hours; }); // 按时薪升序排序 sort(payroll_size, payroll_size + SIZE, [](const Employees& a, const Employees& b) { return a.rate < b.rate; });
完整修正后的main函数示例
int main() { const int SIZE = 5; Employees payroll_size[SIZE]; ifstream myFile; myFile.open("Project3.dat"); if(myFile.fail()) { cerr << "Input file did not open please check it" << endl; return 1; // 打开失败时直接退出程序 } for (int i=0; i< SIZE; i++) { myFile >> payroll_size[i]; } myFile.close(); // 输出读取到的员工信息 cout << "读取到的员工信息:" << endl; for (int i=0; i< SIZE; i++) { cout << payroll_size[i]; } // 按姓名升序排序 sort(payroll_size, payroll_size + SIZE); cout << "\n排序后的员工信息:" << endl; for (int i=0; i< SIZE; i++) { cout << payroll_size[i]; } return 0; }
内容的提问来源于stack exchange,提问作者user9206222
相关产品推荐
相关产品推荐

