13 template <
typename ForwardIterator,
typename T,
class P>
14 inline ForwardIterator
15 fs_eastl_lower_bound(ForwardIterator first, ForwardIterator last,
const T& value, P pred)
17 typedef typename std::iterator_traits<ForwardIterator>::difference_type DifferenceType;
19 DifferenceType d = std::distance(first, last);
23 ForwardIterator i = first;
24 DifferenceType d2 = d >> 1;
40 template<
class FwdIt,
class T,
class P>
41 inline FwdIt fs_branchless_lower_bound(FwdIt begin, FwdIt end, T
const &val, P pred) {
42 while (begin != end) {
44 std::advance(middle, std::distance(begin, end) >> 1);
45 FwdIt middle_plus_one(middle);
47 bool const b = pred(*middle, val);
48 begin = b ? middle_plus_one : begin;
49 end = b ? end : middle;
54 template <
class T,
class Compare = std::less<T>,
class Allocator = std::allocator<T> >
56 std::vector<T, Allocator> data_m;
59 typedef typename std::vector<T>::iterator iterator;
60 typedef typename std::vector<T>::const_iterator const_iterator;
61 typedef typename std::vector<T>::reverse_iterator reverse_iterator;
62 typedef typename std::vector<T>::const_reverse_iterator const_reverse_iterator;
64 flat_set(
const Compare& c = Compare())
69 template <
class InputIterator>
70 flat_set(InputIterator first, InputIterator last,
71 const Compare& c = Compare())
72 : data_m(first, last), cmp(c) {
73 std::sort(begin(), end(), cmp);
76 inline iterator erase(
const T& t) {
77 iterator i = this->find(t);
78 if (i != this->end()) {
79 return data_m.erase(i);
85 inline iterator insert(
const T& t) {
86 iterator i = fs_eastl_lower_bound(begin(), end(), t, cmp);
87 if (i == end() || cmp(t, *i))
88 data_m.insert(i, std::move(t));
92 inline void insert(
const iterator& first,
const iterator& last) {
94 for (it = first; it != last; ++it) {
100 inline const_iterator find(
const T& t)
const {
101 const_iterator i = fs_eastl_lower_bound(begin(), end(), t, cmp);
102 return i == end() || cmp(t, *i) ? end() : i;
105 inline iterator find(
const T& t) {
106 iterator i =fs_eastl_lower_bound(begin(), end(), t, cmp);
107 return i == end() || cmp(t, *i) ? end() : i;
110 inline iterator begin() {
111 return data_m.begin();
114 inline iterator end() {
118 inline const_iterator begin()
const {
119 return data_m.begin();
122 inline const_iterator end()
const {
126 inline reverse_iterator rbegin() {
127 return data_m.rbegin();
130 inline reverse_iterator rend() {
131 return data_m.rend();
134 inline const_reverse_iterator rbegin()
const {
135 return data_m.rbegin();
138 inline const_reverse_iterator rend()
const {
139 return data_m.rend();
142 inline size_t size()
const {
143 return data_m.size();
146 inline void reserve(
size_t size) {
147 data_m.reserve(size);
150 inline std::vector<T, Allocator>& data() {
154 inline bool contains(
const T& t) {
155 return std::binary_search(this->data_m.begin(), this->data_m.end(), t);
158 inline void clear() {
162 void clear_no_resize() {
170 typedef std::vector<T> vector;
173 typedef typename vector::value_type value_type;
174 typedef typename vector::reference reference;
175 typedef typename vector::const_reference const_reference;
176 typedef typename vector::const_iterator iterator;
177 typedef typename vector::const_iterator const_iterator;
178 typedef typename vector::difference_type difference_type;
179 typedef typename vector::size_type size_type;
192 template<
typename InputIterator>
194 vector aux(first, last);
195 std::sort(aux.begin(), aux.end());
197 insert(0, aux.size(), aux.begin());
200 const_iterator begin()
const {
204 const_iterator end()
const {
208 const_iterator cbegin()
const {
209 return impl.cbegin();
212 const_iterator cend()
const {
217 return x.impl == y.impl;
221 return x.impl != y.impl;
232 size_type size()
const {
236 size_type max_size()
const {
237 return impl.max_size();
244 const_iterator lower_bound(
const T& x)
const {
245 size_type n = impl.size(), i = n, j = 0;
258 std::sort(impl.begin(), impl.end());
260 insert(0, impl.size(), impl.begin());
263 void push(
const T& t) {
271 void clear_no_resize() {
277 void insert(size_type i, size_type n, const_iterator first) {
279 size_type h = root(n);
280 impl[i] = *(first + h);
281 insert(2 * i + 1, h, first);
282 insert(2 * i + 2, n - h - 1, first + h + 1);
286 size_type root(size_type n) {
289 while (i <= n)i *= 2;
290 return std::min(i / 2 - 1, n - i / 4);
Definition: flat_set.hpp:55
Definition: flat_set.hpp:169