Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #pragma once
- #include "date.h"
- #include <map>
- #include <set>
- #include <vector>
- #include <string>
- #include <utility>
- #include <algorithm>
- #include <sstream>
- #include <iostream>
- class Database
- {
- public:
- void
- Add(const Date &date, const string &event);
- void
- Print(ostream &out) const;
- template<typename Func>
- int
- RemoveIf(const Func &func);
- template<typename Func>
- vector<string>
- FindIf(const Func &func) const;
- string
- Last(const Date &date) const;
- private:
- map<Date, pair<set<string>, vector<string>>> database;
- };
- template<typename Func>
- int
- Database::RemoveIf(const Func &func)
- {
- int counter = 0;
- map<Date, vector<string>> database_copy(begin(database), end(database));
- auto date_it = begin(database_copy);
- for (; date_it!=end(database_copy); ++date_it)
- {
- pair<set<string>, vector<string>> &events_pair = database[date_it->first];
- set<string> &events_set = events_pair.first;
- vector<string> &events_vector = events_pair.second;
- auto border = stable_partition(begin(events_vector), end(events_vector), [&](const string &event)
- {
- return func(date_it->first, event);
- });
- counter += border - begin(events_vector);
- events_vector.erase(begin(events_vector), border);
- set<string> new_events_set(begin(events_vector), end(events_vector));
- events_set = new_events_set;
- if (events_vector.empty())
- {
- database.erase(date_it->first);
- }
- }
- return counter;
- }
- template<typename Func>
- vector<string>
- Database::FindIf(const Func &func) const
- {
- vector<string> result;
- auto date_it = begin(database);
- for (; date_it!=end(database); ++date_it)
- {
- const pair<set<string>, vector<string>> &events_pair = date_it->second;
- const vector<string> &events = events_pair.second;
- for (const auto &event: events)
- {
- if (func(date_it->first, event))
- {
- ostringstream out;
- out << date_it->first << ' ' << event;
- result.push_back(out.str());
- }
- }
- }
- return result;
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement