pochti_da

Untitled

Jun 7th, 2024
580
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 1.41 KB | None | 0 0
  1. /*
  2. реализовать структуру со следующими интерфейсами
  3.  
  4. add(x): добавить x в структуру
  5. getUnique(): вернуть какой-нибудь элемент, встречающийся в структуре ровно один раз, или null, если таких нет
  6. erase(x): удалить ровно одно вхождение элемента x, если такой есть
  7. */
  8.  
  9.  
  10. template <typename T>
  11. class GetUniqueSet
  12. {
  13. public:
  14.     GetUniqueSet() {}
  15.  
  16.     void Add(T t)
  17.     {
  18.         Data.insert(t);
  19.         int count = (Counters[t] += 1);
  20.  
  21.         if (count == 1)
  22.             UniqueElems.insert(t);
  23.         else if (count == 2)
  24.             UniqueElems.erase(t);
  25.     }
  26.  
  27.     std::optional<T> GetUnique() const
  28.     {
  29.         if (UniqueElems.empty())
  30.             return {};
  31.        
  32.         return *(UniqueElems.begin());
  33.     }
  34.  
  35.     void Erase(T t)
  36.     {
  37.         auto it = Data.find(t);
  38.  
  39.         if (it == Data.end())
  40.             return;
  41.  
  42.         Data.erase(it);
  43.         int count = (Counters[t] -= 1);
  44.  
  45.         if (count == 1)
  46.             UniqueElems.insert(t);
  47.         else if (count == 0)
  48.         {
  49.             UniqueElems.erase(t);
  50.             Counters.erase(t);
  51.         }
  52.     }
  53.  
  54. private:
  55.     std::unordered_multiset<T> Data;
  56.     std::unordered_map<T, int> Counters;
  57.     std::unordered_set<T> UniqueElems;
  58. };
Advertisement
Add Comment
Please, Sign In to add comment