Argentum_02

priority_collection

Dec 1st, 2019
266
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 3.70 KB | None | 0 0
  1. #include "test_runner.h"
  2. #include <algorithm>
  3. #include <iostream>
  4. #include <iterator>
  5. #include <memory>
  6. #include <set>
  7. #include <utility>
  8. #include <vector>
  9.  
  10. using namespace std;
  11.  
  12. template <typename T>
  13. class PriorityCollection {
  14. public:
  15.   using Id = typename vector<T>::reference;
  16.   // Добавить объект с нулевым приоритетом
  17.   // с помощью перемещения и вернуть его идентификатор
  18.   Id Add(T object){
  19.       obj.push_back(move(object));
  20.       Id res(ref(*obj.rbegin()));
  21.       priorities.insert(make_pair(ref(*obj.rbegin()),0));
  22.       return res;
  23.   }
  24.  
  25.   // Добавить все элементы диапазона [range_begin, range_end)
  26.   // с помощью перемещения, записав выданные им идентификаторы
  27.   // в диапазон [ids_begin, ...)
  28.   template <typename ObjInputIt, typename IdOutputIt>
  29.   void Add(ObjInputIt range_begin, ObjInputIt range_end,
  30.            IdOutputIt ids_begin){
  31.       while(range_begin!=range_end){
  32.           ids_begin++ = ref(*obj.insert(move(range_begin++)).first);
  33.       }
  34.   }
  35.  
  36.   // Определить, принадлежит ли идентификатор какому-либо
  37.   // хранящемуся в контейнере объекту
  38.   bool IsValid(Id id) const{
  39.       return obj.find(id)!=obj.end();
  40.   }
  41.  
  42.   // Получить объект по идентификатору
  43.   const T& Get(Id id) const{
  44.       return id;
  45.   }
  46.  
  47.   // Увеличить приоритет объекта на 1
  48.   void Promote(Id id){
  49.       int space2;
  50.       for(auto &&it:priorities){
  51.           if(it.first == id){
  52.               space2 = it.second;
  53.               priorities.erase(it);
  54.               break;
  55.           }
  56.       }
  57.       pair<Id,int> res(id,space2);
  58.       priorities.insert(res);
  59.  
  60.   }
  61.  
  62.   // Получить объект с максимальным приоритетом и его приоритет
  63.   pair<const T&, int> GetMax() const{
  64.       return *priorities.rbegin();
  65.   }
  66.  
  67.   // Аналогично GetMax, но удаляет элемент из контейнера
  68.   pair<T, int> PopMax(){
  69.       pair<Id,int> space(*priorities.rbegin());
  70.       vector<T> res;
  71.       res.push_back(move(space.first));
  72.       return make_pair(move(res[0]),space.second);
  73.   }
  74.  
  75.   struct classcomp {
  76.       bool operator() (const pair<Id,int>& lhs, const pair<Id,int>& rhs) const
  77.       {return lhs.second<rhs.second;}
  78.     };
  79.  
  80. private:
  81.   vector<T> obj;
  82.   set<pair<Id,int>,classcomp> priorities;
  83.   // Приватные поля и методы
  84. };
  85.  
  86.  
  87. class StringNonCopyable : public string {
  88. public:
  89.   using string::string;  // Позволяет использовать конструкторы строки
  90.   StringNonCopyable(const StringNonCopyable&) = delete;
  91.   StringNonCopyable(StringNonCopyable&&) = default;
  92.   StringNonCopyable& operator=(const StringNonCopyable&) = delete;
  93.   StringNonCopyable& operator=(StringNonCopyable&&) = default;
  94. };
  95.  
  96. void TestNoCopy() {
  97.   PriorityCollection<StringNonCopyable> strings;
  98.   const auto white_id = strings.Add("white");
  99.   const auto yellow_id = strings.Add("yellow");
  100.   const auto red_id = strings.Add("red");
  101.  
  102.   strings.Promote(yellow_id);
  103.   for (int i = 0; i < 2; ++i) {
  104.     strings.Promote(red_id);
  105.   }
  106.   strings.Promote(yellow_id);
  107.   {
  108.     const auto item = strings.PopMax();
  109.     ASSERT_EQUAL(item.first, "red");
  110.     ASSERT_EQUAL(item.second, 2);
  111.   }
  112.   {
  113.     const auto item = strings.PopMax();
  114.     ASSERT_EQUAL(item.first, "yellow");
  115.     ASSERT_EQUAL(item.second, 2);
  116.   }
  117.   {
  118.     const auto item = strings.PopMax();
  119.     ASSERT_EQUAL(item.first, "white");
  120.     ASSERT_EQUAL(item.second, 0);
  121.   }
  122. }
  123.  
  124. int main() {
  125.   TestRunner tr;
  126.   RUN_TEST(tr, TestNoCopy);
  127.   return 0;
  128. }
Advertisement
Add Comment
Please, Sign In to add comment