Advertisement
chzchz

Untitled

Apr 7th, 2019
146
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 2.24 KB | None | 0 0
  1. #pragma once
  2. #include "date.h"
  3. #include <map>
  4. #include <set>
  5. #include <vector>
  6. #include <string>
  7. #include <utility>
  8. #include <algorithm>
  9. #include <sstream>
  10. #include <iostream>
  11.  
  12. class Database
  13. {
  14. public:
  15.     void
  16.     Add(const Date &date, const string &event);
  17.  
  18.     void
  19.     Print(ostream &out) const;
  20.  
  21.     template<typename Func>
  22.     int
  23.     RemoveIf(const Func &func);
  24.  
  25.     template<typename Func>
  26.     vector<string>
  27.     FindIf(const Func &func) const;
  28.  
  29.     string
  30.     Last(const Date &date) const;
  31.  
  32. private:
  33.     map<Date, pair<set<string>, vector<string>>> database;
  34. };
  35.  
  36. template<typename Func>
  37. int
  38. Database::RemoveIf(const Func &func)
  39. {
  40.     int counter = 0;
  41.     map<Date, vector<string>> database_copy(begin(database), end(database));
  42.  
  43.     auto date_it = begin(database_copy);
  44.     for (; date_it!=end(database_copy); ++date_it)
  45.     {
  46.         pair<set<string>, vector<string>> &events_pair = database[date_it->first];
  47.         set<string> &events_set = events_pair.first;
  48.         vector<string> &events_vector = events_pair.second;
  49.  
  50.         auto border = stable_partition(begin(events_vector), end(events_vector), [&](const string &event)
  51.         {
  52.             return func(date_it->first, event);
  53.         });
  54.  
  55.         counter += border - begin(events_vector);
  56.         events_vector.erase(begin(events_vector), border);
  57.  
  58.         set<string> new_events_set(begin(events_vector), end(events_vector));
  59.         events_set = new_events_set;
  60.  
  61.         if (events_vector.empty())
  62.         {
  63.             database.erase(date_it->first);
  64.         }
  65.     }
  66.  
  67.     return counter;
  68. }
  69.  
  70. template<typename Func>
  71. vector<string>
  72. Database::FindIf(const Func &func) const
  73. {
  74.     vector<string> result;
  75.  
  76.     auto date_it = begin(database);
  77.     for (; date_it!=end(database); ++date_it)
  78.     {
  79.         const pair<set<string>, vector<string>> &events_pair = date_it->second;
  80.         const vector<string> &events = events_pair.second;
  81.         for (const auto &event: events)
  82.         {
  83.             if (func(date_it->first, event))
  84.             {
  85.                 ostringstream out;
  86.                 out << date_it->first << ' ' << event;
  87.                 result.push_back(out.str());
  88.             }
  89.         }
  90.     }
  91.     return result;
  92. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement