Advertisement
kutuzzzov

Урок 5-1

Feb 20th, 2023
1,238
0
Never
1
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 4.06 KB | None | 0 0
  1. #include <array>
  2. #include <cassert>
  3. #include <iomanip>
  4. #include <iostream>
  5. #include <sstream>
  6. #include <string>
  7. #include <tuple>
  8. #include <unordered_map>
  9. #include <vector>
  10.  
  11. using namespace std;
  12.  
  13. class VehiclePlate {
  14. private:
  15.     auto AsTuple() const {
  16.         return tie(letters_, digits_, region_);
  17.     }
  18.  
  19. public:
  20.     bool operator==(const VehiclePlate& other) const {
  21.         return AsTuple() == other.AsTuple();
  22.     }
  23.  
  24.     VehiclePlate(char l0, char l1, int digits, char l2, int region)
  25.         : letters_{ l0, l1, l2 }
  26.         , digits_(digits)
  27.         , region_(region) {
  28.     }
  29.  
  30.     string ToString() const {
  31.         ostringstream out;
  32.         out << letters_[0] << letters_[1];
  33.  
  34.         // чтобы дополнить цифровую часть номера слева нулями
  35.         // до трёх цифр, используем подобные манипуляторы:
  36.         // setfill задаёт символ для заполнения,
  37.         // right задаёт выравнивание по правому краю,
  38.         // setw задаёт минимальное желаемое количество знаков
  39.         out << setfill('0') << right << setw(3) << digits_;
  40.         out << letters_[2] << setw(2) << region_;
  41.  
  42.         return out.str();
  43.     }
  44.  
  45.     int Hash() const {
  46.         return digits_;
  47.     }
  48.  
  49. private:
  50.     array<char, 3> letters_;
  51.     int digits_;
  52.     int region_;
  53. };
  54.  
  55. ostream& operator<<(ostream& out, VehiclePlate plate) {
  56.     out << plate.ToString();
  57.     return out;
  58. }
  59.  
  60. class VehiclePlateHasher {
  61. public:
  62.     size_t operator()(const VehiclePlate& plate) const {
  63.         // измените эту функцию, чтобы она учитывала все данные номера
  64.         // рекомендуется использовать метод ToString() и существующий
  65.         // класс hash<string>
  66.         return static_cast<size_t>(hasher_(plate.ToString()));  
  67.     }
  68.  
  69. private:
  70.     hash<string> hasher_;
  71. };
  72.  
  73. class ParkingCounter {
  74. public:
  75.     // зарегистрировать парковку автомобиля
  76.     void Park(VehiclePlate car) {
  77.         // место для вашей реализации
  78.         ++car_to_parks_[car];
  79.     }
  80.  
  81.     // метод возвращает количество зарегистрированных
  82.     // парковок автомобиля
  83.     int GetCount(const VehiclePlate& car) const {
  84.         // место для вашей реализации
  85.         auto search = car_to_parks_.find(car);
  86.         if (search != car_to_parks_.end()) {
  87.             return car_to_parks_.at(car);
  88.         } else {
  89.             return {};
  90.         }
  91.     }
  92.  
  93.     auto& GetAllData() const {
  94.         return car_to_parks_;
  95.     }
  96.  
  97. private:
  98.     // для хранения данных используйте контейнер unordered_map
  99.     // назовите поле класса car_to_parks_
  100.     unordered_map<VehiclePlate, int, VehiclePlateHasher> car_to_parks_;
  101. };
  102.  
  103. int main() {
  104.     ParkingCounter parking;
  105.  
  106.     parking.Park({ 'B', 'H', 840, 'E', 99 });
  107.     parking.Park({ 'O', 'K', 942, 'K', 78 });
  108.     parking.Park({ 'O', 'K', 942, 'K', 78 });
  109.     parking.Park({ 'O', 'K', 942, 'K', 78 });
  110.     parking.Park({ 'O', 'K', 942, 'K', 78 });
  111.     parking.Park({ 'H', 'E', 968, 'C', 79 });
  112.     parking.Park({ 'T', 'A', 326, 'X', 83 });
  113.     parking.Park({ 'H', 'H', 831, 'P', 116 });
  114.     parking.Park({ 'A', 'P', 831, 'Y', 99 });
  115.     parking.Park({ 'P', 'M', 884, 'K', 23 });
  116.     parking.Park({ 'O', 'C', 34, 'P', 24 });
  117.     parking.Park({ 'M', 'Y', 831, 'M', 43 });
  118.     parking.Park({ 'B', 'P', 831, 'M', 79 });
  119.     parking.Park({ 'O', 'K', 942, 'K', 78 });
  120.     parking.Park({ 'K', 'T', 478, 'P', 49 });
  121.     parking.Park({ 'X', 'P', 850, 'A', 50 });
  122.  
  123.     assert(parking.GetCount({ 'O', 'K', 942, 'K', 78 }) == 5);
  124.     assert(parking.GetCount({ 'A', 'B', 111, 'C', 99 }) == 0);
  125.  
  126.     for (const auto& [plate, count] : parking.GetAllData()) {
  127.         cout << plate << " "s << count << endl;
  128.     }
  129. }
Advertisement
Comments
Add Comment
Please, Sign In to add comment
Advertisement