2 #ifndef OPENGM_RANDOM_ACCESS_SET_HXX
3 #define OPENGM_RANDOM_ACCESS_SET_HXX
20 template<
class Key,
class Compare=std::less<Key>,
class Alloc=std::allocator<Key> >
24 typedef std::vector<Key,Alloc> VectorType;
43 typedef typename VectorType::iterator
iterator;
57 RandomAccessSet(
const size_t,
const Compare& compare=Compare(),
const Alloc& alloc=Alloc());
58 RandomAccessSet(
const Compare& compare=Compare(),
const Alloc& alloc=Alloc());
59 template <
class InputIterator>
60 RandomAccessSet(InputIterator, InputIterator,
const Compare& compare =Compare(),
const Alloc & alloc=Alloc());
66 const value_type&
operator[](
const size_type)
const;
68 const_iterator
begin()
const;
69 const_iterator
end()
const;
70 const_iterator
rbegin()
const;
71 const_iterator
rend()
const;
78 size_type
size()
const;
80 std::pair< const_iterator,bool>
insert(
const value_type&);
81 template <
class InputIterator>
82 void insert(InputIterator, InputIterator);
83 const_iterator
insert(const_iterator ,
const value_type&);
84 void erase(iterator position);
85 size_type
erase(
const key_type& );
86 void erase( const_iterator, const_iterator);
91 const_iterator
find(
const key_type&)
const;
92 iterator
find(
const key_type&);
93 size_type
count(
const key_type&)
const;
96 std::pair<const_iterator,const_iterator>
equal_range(
const key_type&)
const;
99 std::pair<iterator,iterator>
equal_range(
const key_type&) ;
104 vector_.reserve(size);
107 return vector_.capacity();
112 vector_.assign(set.begin(),set.end());
116 std::vector<Key> vector_;
124 template<
class Key,
class Compare,
class Alloc>
128 const size_t reserveSize,
129 const Compare& compare,
134 vector_.reserve(reserveSize);
140 template<
class Key,
class Compare,
class Alloc>
147 return vector_[index];
153 template<
class Key,
class Compare,
class Alloc>
157 const Compare& compare,
168 template<
class Key,
class Compare,
class Alloc>
169 template <
class InputIterator>
173 InputIterator beginInput,
174 InputIterator endInput,
175 const Compare& compare,
181 while(beginInput!=endInput) {
182 this->insert(*beginInput);
189 template<
class Key,
class Compare,
class Alloc>
195 : vector_(src.vector_),
196 compare_(src.compare_) {
201 template<
class Key,
class Compare,
class Alloc>
210 compare_=src.compare_;
217 template<
class Key,
class Compare,
class Alloc>
221 return vector_.begin();
226 template<
class Key,
class Compare,
class Alloc>
230 return vector_.end();
234 template<
class Key,
class Compare,
class Alloc>
238 return vector_.rbegin();
243 template<
class Key,
class Compare,
class Alloc>
247 return vector_.rend();
252 template<
class Key,
class Compare,
class Alloc>
256 return vector_.begin();
261 template<
class Key,
class Compare,
class Alloc>
265 return vector_.end();
270 template<
class Key,
class Compare,
class Alloc>
274 return vector_.rbegin();
279 template<
class Key,
class Compare,
class Alloc>
283 return vector_.rend();
288 template<
class Key,
class Compare,
class Alloc>
292 return vector_.empty();
297 template<
class Key,
class Compare,
class Alloc>
301 return vector_.size();
306 template<
class Key,
class Compare,
class Alloc>
310 return vector_.max_size();
320 template<
class Key,
class Compare,
class Alloc>
321 inline std::pair<typename RandomAccessSet<Key,Compare,Alloc>::const_iterator,
bool>
327 iterator i(lower_bound(static_cast<Key>(value)));
328 if(i == end() || compare_(static_cast<Key>(value), *i)) {
329 i = vector_.insert(i, static_cast<Key>(value));
332 return std::make_pair(i, !found);
339 template<
class Key,
class Compare,
class Alloc>
340 template <
class InputIterator>
349 this->insert(*first);
358 template<
class Key,
class Compare,
class Alloc>
366 if((position == begin() || this->
operator()(*(position-1),value))
367 && (position == end() || this->
operator()(value, *position))) {
368 return vector_.insert(position, value);
370 return insert(value).first;
375 template<
class Key,
class Compare,
class Alloc>
379 typename RandomAccessSet<Key,Compare,Alloc>::iterator position
382 vector_.erase(position);
387 template<
class Key,
class Compare,
class Alloc>
388 inline typename RandomAccessSet<Key,Compare,Alloc>::size_type
391 const typename RandomAccessSet<Key,Compare,Alloc>::key_type& x
406 template<
class Key,
class Compare,
class Alloc>
410 const typename RandomAccessSet<Key,Compare,Alloc>::const_iterator first,
411 const typename RandomAccessSet<Key,Compare,Alloc>::const_iterator last
414 vector_.erase(first,last);
419 template<
class Key,
class Compare,
class Alloc>
426 vector_.swap(rhs.vector_);
427 compare_=rhs.compare_;
433 template<
class Key,
class Compare,
class Alloc>
442 template<
class Key,
class Compare,
class Alloc>
451 template<
class Key,
class Compare,
class Alloc>
462 template<
class Key,
class Compare,
class Alloc>
469 const_iterator i(lower_bound(value));
470 if (i != end() && compare_(value, *i))
481 template<
class Key,
class Compare,
class Alloc>
482 inline typename RandomAccessSet<Key,Compare,Alloc>::iterator
485 const typename RandomAccessSet<Key,Compare,Alloc>::key_type& value
488 iterator i(lower_bound(value));
489 if (i != end() && compare_(value, *i))
499 template<
class Key,
class Compare,
class Alloc>
500 inline typename RandomAccessSet<Key,Compare,Alloc>::size_type
506 return find(value) != end();
512 template<
class Key,
class Compare,
class Alloc>
519 return std::lower_bound(vector_.begin(), vector_.end(), value, compare_);
525 template<
class Key,
class Compare,
class Alloc>
526 inline typename RandomAccessSet<Key,Compare,Alloc>::iterator
529 const typename RandomAccessSet<Key,Compare,Alloc>::key_type& value
532 return std::lower_bound(vector_.begin(), vector_.end(), value, compare_);
538 template<
class Key,
class Compare,
class Alloc>
539 inline typename RandomAccessSet<Key,Compare,Alloc>::const_iterator
542 const typename RandomAccessSet<Key,Compare,Alloc>::key_type& value
545 return std::upper_bound(vector_.begin(), vector_.end(), value, compare_);
551 template<
class Key,
class Compare,
class Alloc>
552 inline typename RandomAccessSet<Key,Compare,Alloc>::iterator
555 const typename RandomAccessSet<Key,Compare,Alloc>::key_type& value
558 return std::upper_bound(vector_.begin(), vector_.end(), value, compare_);
564 template<
class Key,
class Compare,
class Alloc>
565 inline std::pair<typename RandomAccessSet<Key,Compare,Alloc>::const_iterator,
typename RandomAccessSet<Key,Compare,Alloc>::const_iterator>
568 const typename RandomAccessSet<Key,Compare,Alloc>::key_type& value
571 return std::equal_range(vector_.begin(), vector_.end(), value, compare_);
577 template<
class Key,
class Compare,
class Alloc>
578 inline std::pair<typename RandomAccessSet<Key,Compare,Alloc>::iterator,
typename RandomAccessSet<Key,Compare,Alloc>::iterator>
581 const typename RandomAccessSet<Key,Compare,Alloc>::key_type& value
584 return std::equal_range(vector_.begin(), vector_.end(), value, compare_);
588 template<
class Key,
class Compare,
class Alloc>
589 inline typename RandomAccessSet<Key,Compare,Alloc>::allocator_type
592 return vector_.get_allocator();
597 #endif // OPENGM_RANDOM_ACCESS_SET_HXX
const_iterator upper_bound(const key_type &) const
size_type count(const key_type &) const
count elements
const value_type & operator[](const size_type) const
const access values
const_iterator rend() const
reverse const end iterator
allocator_type get_allocator() const
allocators
Compare key_compare
comperator
Alloc allocator_type
acclocator
const_iterator rbegin() const
reverse const begin iterator
const_iterator find(const key_type &) const
void swap(RandomAccessSet &)
swap random access sets
VectorType::const_iterator const_iterator
const iterator type
bool empty() const
query if the set is empty
key_compare key_comp() const
key comparator
const_iterator begin() const
const begin iterator
Key ValueType
value type of the set
value_compare value_comp() const
value comparator
const_iterator end() const
const end iterator
VectorType::difference_type difference_type
difference type
std::pair< const_iterator, bool > insert(const value_type &)
RandomAccessSet & operator=(const RandomAccessSet &)
assignment operator
void reserve(const size_t size)
Key key_type
key type of the set
std::pair< const_iterator, const_iterator > equal_range(const key_type &) const
Key value_type
value type of the set
void erase(iterator position)
VectorType::iterator iterator
iterator type
set with O(n) insert and O(1) access
void assignFromSet(const SET &set)
VectorType::size_type size_type
size type
Alloc::const_reference const_reference
const reference type
VectorType::const_pointer const_pointer
const pointer type
RandomAccessSet(const size_t, const Compare &compare=Compare(), const Alloc &alloc=Alloc())
constructor
const_iterator lower_bound(const key_type &) const
size_type size() const
number of elements of the set
VectorType::const_reverse_iterator const_reverse_iterator
const reverse iterator
void clear()
clear the set
Compare value_compare
value comperator
size_type max_size() const
maximum size of the underlying container