shushus

Спринт 10. Устройство unordered_map и unordered_set. Задание 1.

Mar 8th, 2023
323
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 2.90 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) : letters_{l0, l1, l2}
  25.                                                                     , digits_(digits)
  26.                                                                     , region_(region) {}
  27.  
  28.     string ToString() const {
  29.         ostringstream out;
  30.         out << letters_[0] << letters_[1];
  31.         out << setfill('0') << right << setw(3) << digits_;
  32.         out << letters_[2] << setw(2) << region_;
  33.  
  34.         return out.str();
  35.     }
  36.  
  37.     int Hash() const {
  38.         return digits_;
  39.     }
  40.  
  41. private:
  42.     array<char, 3> letters_;
  43.     int digits_;
  44.     int region_;
  45. };
  46.  
  47. ostream& operator<<(ostream& out, VehiclePlate plate) {
  48.     out << plate.ToString();
  49.     return out;
  50. }
  51.  
  52. class VehiclePlateHasher {
  53. public:
  54.     size_t operator()(const VehiclePlate& plate) const {
  55.         return size_t(hash_(plate.ToString()));//
  56.     }
  57. private:
  58.     hash<string> hash_;
  59. };
  60.  
  61. class ParkingCounter {
  62. public:
  63.  
  64.     void Park(VehiclePlate car) {
  65.         ++car_to_parks_[car];
  66.     }
  67.  
  68.     int GetCount(const VehiclePlate& car) const {
  69.        
  70.         auto helper = car_to_parks_.find(car);
  71.        
  72.         if (helper == car_to_parks_.end()) {
  73.             return {};
  74.         } else {
  75.             return car_to_parks_.at(car);
  76.         }
  77.     }
  78.  
  79.     auto& GetAllData() const {
  80.         return car_to_parks_;
  81.     }
  82.  
  83. private:
  84.     unordered_map<VehiclePlate, int, VehiclePlateHasher> car_to_parks_;
  85. };
  86.  
  87. int main() {
  88.     ParkingCounter parking;
  89.  
  90.     parking.Park({'B', 'H', 840, 'E', 99});
  91.     parking.Park({'O', 'K', 942, 'K', 78});
  92.     parking.Park({'O', 'K', 942, 'K', 78});
  93.     parking.Park({'O', 'K', 942, 'K', 78});
  94.     parking.Park({'O', 'K', 942, 'K', 78});
  95.     parking.Park({'H', 'E', 968, 'C', 79});
  96.     parking.Park({'T', 'A', 326, 'X', 83});
  97.     parking.Park({'H', 'H', 831, 'P', 116});
  98.     parking.Park({'A', 'P', 831, 'Y', 99});
  99.     parking.Park({'P', 'M', 884, 'K', 23});
  100.     parking.Park({'O', 'C', 34, 'P', 24});
  101.     parking.Park({'M', 'Y', 831, 'M', 43});
  102.     parking.Park({'B', 'P', 831, 'M', 79});
  103.     parking.Park({'O', 'K', 942, 'K', 78});
  104.     parking.Park({'K', 'T', 478, 'P', 49});
  105.     parking.Park({'X', 'P', 850, 'A', 50});
  106.  
  107.     assert(parking.GetCount({'O', 'K', 942, 'K', 78}) == 5);
  108.     assert(parking.GetCount({'A', 'B', 111, 'C', 99}) == 0);
  109.  
  110.     for (const auto& [plate, count] : parking.GetAllData()) {
  111.         cout << plate << " "s << count << endl;
  112.     }
  113. }
Advertisement
Add Comment
Please, Sign In to add comment