Advertisement
chevengur

СПРИНТ № 9 | Ассоциативные контейнеры | Устройство unordered_map и unordered_set 1/2

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