C++中基类和派生类的一个应用
2017-04-01 10:59
316 查看
题意:一个公司有很多员工,也有主管。每天员工和主管都需要签到,但主管可以用签到机确认有多少人上班,也可以按员工ID顺序或签到顺序打印出上班的员工,还可以找出倒数第n个上班的员工是谁。
要求:
用面向对象的方法分析和实现;
所有操作的时间消耗和空间消耗越低越好,其中排序算法的时间复杂度不超过O(nlogn),极端情况下也不可以退化为n^2
思路:员工是基类,主管是派生类。选用排序方式:堆排序priority_queue,时间复杂度O(nlogn)
#include <iostream>
#include <string>
#include <vector>
#include <queue>
using std::cout;
using std::endl;
using std::string;
using std::vector;
using std::pair;
using std::priority_queue;
class Staff
{
public:
Staff() = default; //生成一个默认的构造函数
Staff(vector<std::pair<int, int>> staff) : attendance(staff) {}
virtual ~Staff() = default; //默认析构函数
//new attend staff
void attend(pair<int, int> people)
{
attendance.push_back(people);
};
protected:
vector<pair<int, int>> attendance; //签到顺序和ID
};
class Manager : public Staff
{
public:
Manager() = default;
virtual ~Manager() = default;
int attendance_num()
{
return attendance.size();
}; //签到人数
void print_ID()
{
auto comp = [](pair<int, int>&a, pair<int, int>&b)
{
return a.first > b.first;
};
priority_queue<pair<int, int>, vector<pair<int, int>>, decltype(comp)> temp(comp);
for (int i = 0; i < attendance.size(); i++)
{
temp.push(attendance[i]);
}
while (!temp.empty())
{
auto it = temp.top();
cout << it.first << it.second << endl;
temp.pop();
}
};
void print_time()
{
auto comp = [](pair<int, int>&a, pair<int, int>&b)
{
return a.second > b.second;
};
priority_queue<pair<int, int>, vector<pair<int, int>>, decltype(comp)> temp(comp); //堆排序
for (int i = 0; i < attendance.size(); i++)
{
temp.push(attendance[i]);
}
while (!temp.empty())
{
auto it = temp.top();
cout << it.first << it.second << endl;
temp.pop();
}
};
};
大概意思是这样,如有问题请指正~!
要求:
用面向对象的方法分析和实现;
所有操作的时间消耗和空间消耗越低越好,其中排序算法的时间复杂度不超过O(nlogn),极端情况下也不可以退化为n^2
思路:员工是基类,主管是派生类。选用排序方式:堆排序priority_queue,时间复杂度O(nlogn)
#include <iostream>
#include <string>
#include <vector>
#include <queue>
using std::cout;
using std::endl;
using std::string;
using std::vector;
using std::pair;
using std::priority_queue;
class Staff
{
public:
Staff() = default; //生成一个默认的构造函数
Staff(vector<std::pair<int, int>> staff) : attendance(staff) {}
virtual ~Staff() = default; //默认析构函数
//new attend staff
void attend(pair<int, int> people)
{
attendance.push_back(people);
};
protected:
vector<pair<int, int>> attendance; //签到顺序和ID
};
class Manager : public Staff
{
public:
Manager() = default;
virtual ~Manager() = default;
int attendance_num()
{
return attendance.size();
}; //签到人数
void print_ID()
{
auto comp = [](pair<int, int>&a, pair<int, int>&b)
{
return a.first > b.first;
};
priority_queue<pair<int, int>, vector<pair<int, int>>, decltype(comp)> temp(comp);
for (int i = 0; i < attendance.size(); i++)
{
temp.push(attendance[i]);
}
while (!temp.empty())
{
auto it = temp.top();
cout << it.first << it.second << endl;
temp.pop();
}
};
void print_time()
{
auto comp = [](pair<int, int>&a, pair<int, int>&b)
{
return a.second > b.second;
};
priority_queue<pair<int, int>, vector<pair<int, int>>, decltype(comp)> temp(comp); //堆排序
for (int i = 0; i < attendance.size(); i++)
{
temp.push(attendance[i]);
}
while (!temp.empty())
{
auto it = temp.top();
cout << it.first << it.second << endl;
temp.pop();
}
};
};
大概意思是这样,如有问题请指正~!
相关文章推荐
- c++抽象类的派生类不实现基类的纯虚函数,那么该派生类仍然为一个抽象类
- C++派生字符串并和基类字符串连接为一个字符串
- C++让基类握住派生类的指针
- C++中三种不同的继承方式(public、protected、private)的基类特性和派生类特性
- 写一个程序,定义抽象基类Shape,由它派生出3个派生类
- 写一个程序,定义抽象基类Shape,由它派生出5个派生类
- C++学习笔记(1)——基类、派生类的对象空间
- c++ - 小心从派生类到基类的转换 (ptr Vs. obj)
- 关于派生类的构造的——一个程序的分析(钱能c++ P353),加上了析构函数
- 理解C++基类与派生类
- C++基类调用派生类的方法
- C++学习笔记(5)——基类、派生类的构造函数、析构函数的调用顺序
- C++中基类,派生类 类成员对象的构造函数,析构函数的顺序
- C++基类和派生类
- 关于派生类的构造的——一个程序的分析(钱能c++ P353),加上了析构函数
- C++ 基类和派生类
- C++基础--基类和派生类
- C++中定义派生类之前需要看到基类的定义实体
- 关于C++基类、派生类的引用和指针
- C++中的基类与派生类