Ae_Mc

C++ Белый Пояс. Имена и фамилии — 2

Dec 27th, 2020 (edited)
537
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 2.48 KB | None | 0 0
  1. #include <iostream>
  2. #include <string>
  3. #include <algorithm>
  4. #include <vector>
  5. #include <map>
  6.  
  7. using namespace std;
  8.  
  9. class Person {
  10.   public:
  11.     void ChangeFirstName(int year, const string &firstName) {
  12.       firstNames[year] = firstName;
  13.     }
  14.  
  15.     void ChangeLastName(int year, const string &lastName) {
  16.       lastNames[year] = lastName;
  17.     }
  18.  
  19.     string GetFullName(int year) const {
  20.       return FirstAndLastNameToText(GetLatestName(year, firstNames),
  21.                                     GetLatestName(year, lastNames));
  22.     }
  23.  
  24.     string GetFullNameWithHistory(int year) const {
  25.       vector<string> firstNamesChain = GetUniqueChain(year, firstNames);
  26.       vector<string> lastNamesChain = GetUniqueChain(year, lastNames);
  27.       string firstName = GetNameFromUniqueChain(firstNamesChain);
  28.       string lastName = GetNameFromUniqueChain(lastNamesChain);
  29.  
  30.       return FirstAndLastNameToText(firstName, lastName);
  31.     }
  32.  
  33.   private:
  34.     map<int, string> firstNames;
  35.     map<int, string> lastNames;
  36.  
  37.     string FirstAndLastNameToText(const string &firstName, const string &lastName) const {
  38.       if (firstName.empty() && lastName.empty())
  39.         return "Incognito";
  40.       if (firstName.empty())
  41.         return lastName + " with unknown first name";
  42.       if (lastName.empty())
  43.         return firstName + " with unknown last name";
  44.       return firstName + " " + lastName;
  45.     }
  46.  
  47.     string GetLatestName(const int &year, const map<int, string> &names) const {
  48.       string nameString = "";
  49.       for(const auto &name : names)
  50.         if (name.first > year)
  51.           break;
  52.         else
  53.           nameString = name.second;
  54.       return nameString;
  55.     }
  56.  
  57.     vector<string> GetUniqueChain(const int &year, const map<int, string> &names) const {
  58.       vector<string> uniqueChain;
  59.       for (const auto &[nameYear, name] : names)
  60.         if (nameYear > year)
  61.           break;
  62.         else if (uniqueChain.empty() || name != uniqueChain.back())
  63.           uniqueChain.push_back(name);
  64.       return uniqueChain;
  65.     }
  66.  
  67.     string GetNameFromUniqueChain(const vector<string> &uniqueChain) const {
  68.       switch(uniqueChain.size()) {
  69.         case 0:
  70.           return "";
  71.         case 1:
  72.           return uniqueChain[0];
  73.         default:
  74.           string name = uniqueChain.back() + " (" + *(uniqueChain.end() - 2);
  75.           for(int i = uniqueChain.size() - 3; i >= 0; i--)
  76.             name += ", " + uniqueChain[i];
  77.           return name + ")";
  78.       }
  79.     }
  80. };
Add Comment
Please, Sign In to add comment