Advertisement
Guest User

Untitled

a guest
Nov 16th, 2019
86
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 2.91 KB | None | 0 0
  1. static size_t ID {0};
  2. template <typename T>
  3. class PriorityCollection {
  4. public:
  5. using Id = size_t/* тип, используемый для идентификаторов */;
  6.  
  7. // Добавить объект с нулевым приоритетом
  8. // с помощью перемещения и вернуть его идентификатор
  9. Id Add(T object) {
  10. p.insert({0, ID});
  11. data.insert({ID++, move(object)});
  12. return ID;
  13. }
  14.  
  15. // Добавить все элементы диапазона [range_begin, range_end)
  16. // с помощью перемещения, записав выданные им идентификаторы
  17. // в диапазон [ids_begin, ...)
  18. template <typename ObjInputIt, typename IdOutputIt>
  19. void Add(ObjInputIt range_begin, ObjInputIt range_end,
  20. IdOutputIt ids_begin) {
  21. for (auto it = range_begin; it != range_end; it++) {
  22. *ids_begin = Add(move(*it));
  23. }
  24. }
  25.  
  26. // Определить, принадлежит ли идентификатор какому-либо
  27. // хранящемуся в контейнере объекту
  28. bool IsValid(Id id) const {
  29. for (const auto& i : p) {
  30. if (i.second == id) {
  31. return true;
  32. }
  33. }
  34. return false;
  35. }
  36.  
  37. // Получить объект по идентификатору
  38. const T& Get(Id id) const {
  39. for (auto& item : data) {
  40. if (item.first == id) {
  41. return item.second;
  42. }
  43. }
  44. }
  45.  
  46. // Увеличить приоритет объекта на 1
  47. void Promote(Id id) {
  48. // for (auto it = p.begin(); it != p.end();)
  49. //
  50. for (auto& item : p) {
  51. if (item.second == id) {
  52. auto temp = item;
  53. p.erase(item);
  54. temp.first++;
  55. p.insert(temp);
  56. break;
  57. }
  58. }
  59. }
  60.  
  61. // Получить объект с максимальным приоритетом и его приоритет
  62. pair<const T&, int> GetMax() const {
  63. auto item1 = *prev(p.end());
  64. return {Get(item1.second), item1.first};
  65. }
  66.  
  67. // Аналогично GetMax, но удаляет элемент из контейнера
  68. pair<T, int> PopMax() {
  69. pair<int, Id> item = *prev(p.end());
  70. p.erase(prev(p.end()));
  71. auto it_to_delete = data.begin();
  72. for (auto it = data.begin(); it != data.end(); it++) {
  73. if (it->first == item.second) {
  74. it_to_delete = it;
  75. break;
  76. }
  77. }
  78. pair<T, int> res;
  79. res = make_pair(move(it_to_delete->second), item.first);
  80. data.erase(it_to_delete);
  81. return move(res);
  82. }
  83.  
  84. private:
  85. set<pair<int, Id>> p;
  86. set<pair<Id, T>> data;
  87. };
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement