1#ifndef ALGORITHMS_ORDERED_SET_H
2#define ALGORITHMS_ORDERED_SET_H
4#include "downward/utils/collections.h"
5#include "downward/utils/hash.h"
6#include "downward/utils/rng.h"
11namespace ordered_set {
18 std::vector<T> ordered_items;
19 utils::HashSet<T> unordered_items;
24 assert(unordered_items.size() == ordered_items.size());
25 return ordered_items.empty();
30 assert(unordered_items.size() == ordered_items.size());
31 return ordered_items.size();
36 ordered_items.clear();
37 unordered_items.clear();
45 void insert(
const T& item)
47 auto result = unordered_items.insert(item);
48 bool inserted = result.second;
50 ordered_items.push_back(item);
52 assert(unordered_items.size() == ordered_items.size());
55 bool contains(
const T& item)
const
57 return unordered_items.count(item) != 0;
60 void shuffle(utils::RandomNumberGenerator& rng)
62 rng.shuffle(ordered_items);
65 const T& operator[](
int pos)
const
67 assert(utils::in_bounds(pos, ordered_items));
68 return ordered_items[pos];
71 const std::vector<T>& get_as_vector()
const {
return ordered_items; }
73 std::vector<T> pop_as_vector()
75 std::vector<T> items = std::move(ordered_items);
76 unordered_items.clear();
81 typename std::vector<T>::const_iterator begin()
const
83 return ordered_items.begin();
86 typename std::vector<T>::const_iterator end()
const
88 return ordered_items.end();