您的位置:首页 > 编程语言 > C语言/C++

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();

               }

        };

};

大概意思是这样,如有问题请指正~!
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: