Advertisement
chevengur

СПРИНТ № 9 | Ассоциативные контейнеры | Урок 4: Хеш-функции

Aug 20th, 2024
159
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 3.39 KB | None | 0 0
  1. #include <array>
  2. #include <iomanip>
  3. #include <iostream>
  4. #include <optional>
  5. #include <sstream>
  6. #include <algorithm>
  7. #include <string>
  8. #include <vector>
  9.  
  10. using namespace std;
  11.  
  12. class VehiclePlate {
  13. public:
  14.     VehiclePlate(char l0, char l1, int digits, char l2, int region)
  15.         : letters_{l0, l1, l2}
  16.         , digits_(digits)
  17.         , region_(region) {
  18.     }
  19.  
  20.     string ToString() const {
  21.         ostringstream out;
  22.         out << letters_[0] << letters_[1];
  23.         // чтобы дополнить цифровую часть номера слева нулями
  24.         // до трёх цифр, используем подобные манипуляторы:
  25.         // setfill задаёт символ для заполнения,
  26.         // right задаёт выравнивание по правому краю,
  27.         // setw задаёт минимальное желаемое количество знаков
  28.         out << setfill('0') << right << setw(3) << digits_;
  29.         out << letters_[2] << setw(2) << region_;
  30.  
  31.         return out.str();
  32.     }
  33.  
  34.     int Hash() const {
  35.         return digits_;
  36.     }
  37.  
  38.     friend bool operator==(const VehiclePlate&, const VehiclePlate&);
  39.  
  40. private:
  41.     array<char, 3> letters_;
  42.     int digits_;
  43.     int region_;
  44. };
  45.  
  46. bool operator==(const VehiclePlate& lhs, const VehiclePlate& rhs)
  47. {
  48.     return lhs.region_ == rhs.region_ && lhs.digits_ == rhs.digits_ && std::equal(lhs.letters_.begin(), lhs.letters_.end(), rhs.letters_.begin());
  49. }
  50.  
  51. ostream& operator<<(ostream& out, VehiclePlate plate) {
  52.     out << plate.ToString();
  53.     return out;
  54. }
  55.  
  56. template <typename T>
  57. class HashableContainer {
  58. public:
  59.     void Insert(T elem) {
  60.         int index = elem.Hash();
  61.  
  62.         // если вектор недостаточно велик для этого индекса,
  63.         // то увеличим его, выделив место с запасом
  64.         if (index >= int(elements_.size())) {
  65.             elements_.resize(index * 2 + 1);
  66.         }
  67.  
  68.         auto it = find(elements_[index].begin(), elements_[index].end(), elem);
  69.         if(it == elements_[index].end())
  70.         {
  71.             elements_[index].push_back(elem);
  72.         }
  73.         else
  74.         {
  75.             return;
  76.         }
  77.     }
  78.  
  79.     void PrintAll(ostream& out) const {
  80.         for (auto& e : elements_) {
  81.             if (e.empty()) {
  82.                 continue;
  83.             }
  84.             for(const auto& num: e)
  85.             {
  86.                 out << num << endl;
  87.             }
  88.         }
  89.     }
  90.  
  91.     const auto& GetVector() const {
  92.         return elements_;
  93.     }
  94.  
  95. private:
  96.     vector <vector<T>> elements_;
  97. };
  98.  
  99. int main() {
  100.     HashableContainer<VehiclePlate> plate_base;
  101.     plate_base.Insert({'B', 'H', 840, 'E', 99});
  102.     plate_base.Insert({'O', 'K', 942, 'K', 78});
  103.     plate_base.Insert({'O', 'K', 942, 'K', 78});
  104.     plate_base.Insert({'O', 'K', 942, 'K', 78});
  105.     plate_base.Insert({'O', 'K', 942, 'K', 78});
  106.     plate_base.Insert({'H', 'E', 968, 'C', 79});
  107.     plate_base.Insert({'T', 'A', 326, 'X', 83});
  108.     plate_base.Insert({'H', 'H', 831, 'P', 116});
  109.     plate_base.Insert({'P', 'M', 884, 'K', 23});
  110.     plate_base.Insert({'O', 'C', 34, 'P', 24});
  111.     plate_base.Insert({'M', 'Y', 831, 'M', 43});
  112.     plate_base.Insert({'K', 'T', 478, 'P', 49});
  113.     plate_base.Insert({'X', 'P', 850, 'A', 50});
  114.  
  115.     plate_base.PrintAll(cout);
  116. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement