15 static constexpr Index INVALID_INDEX = std::numeric_limits<Index>::max();
17 bool Has(Index
id)
const
19 return id < sparse_.size() && sparse_[id] != INVALID_INDEX && sparse_[id] < dense_.size() && dense_[sparse_[id]].id == id;
22 void Insert(Index
id,
const T& value)
24 if (
id >= sparse_.size())
26 sparse_.resize(
id + 1, INVALID_INDEX);
31 dense_[sparse_[id]].data = value;
35 sparse_[id] =
static_cast<Index
>(dense_.size());
36 dense_.push_back({ id, value });
47 Index denseIdx = sparse_[id];
48 auto lastIdx =
static_cast<Index
>(dense_.size() - 1);
50 if (denseIdx != lastIdx)
52 std::swap(dense_[denseIdx], dense_[lastIdx]);
53 sparse_[dense_[denseIdx].id] = denseIdx;
57 sparse_[id] = INVALID_INDEX;
63 return dense_[sparse_[id]].data;
66 const T& Get(Index
id)
const
69 return dense_[sparse_[id]].data;
72 std::vector<T> Values()
const
75 for (
const auto& pair : dense_)
77 out.push_back(pair.data);
82 std::vector<Index> Keys()
const
84 std::vector<Index> out;
85 for (
const auto& pair : dense_)
87 out.push_back(pair.id);
98 [[nodiscard]]
size_t Size()
const
100 return dense_.size();
102 [[nodiscard]]
bool Empty()
const
104 return dense_.empty();
115 return dense_.begin();
123 return dense_.begin();
131 std::vector<Index> sparse_;
132 std::vector<Entry> dense_;
Definition sparse_set.h:108