1 |
#pragma once |
2 |
|
3 |
template<typename T> |
4 |
void |
5 |
unordered_erase (std::vector<T> &vec, typename std::vector<T>::iterator pos) |
6 |
{ |
7 |
vec.at (vec.end () - pos) = vec.back (); |
8 |
vec.pop_back (); |
9 |
} |
10 |
|
11 |
template<typename T> |
12 |
void |
13 |
unordered_erase (std::vector<T> &vec, typename std::vector<T>::size_type pos) |
14 |
{ |
15 |
unordered_erase (vec, vec.begin () + pos); |
16 |
} |
17 |
|
18 |
template<typename T> |
19 |
void |
20 |
unordered_erase (std::vector<T> &vec, typename std::vector<T>::const_reference element) |
21 |
{ |
22 |
unordered_erase (vec, &element - &vec.front ()); |
23 |
} |
24 |
|
25 |
template<typename T> |
26 |
struct unordered_vector |
27 |
{ |
28 |
typedef std::vector<T> vector_type; |
29 |
|
30 |
typedef typename vector_type::value_type value_type; |
31 |
typedef typename vector_type::pointer pointer; |
32 |
typedef typename vector_type::const_pointer const_pointer; |
33 |
typedef typename vector_type::reference reference; |
34 |
typedef typename vector_type::const_reference const_reference; |
35 |
typedef typename vector_type::iterator iterator; |
36 |
typedef typename vector_type::const_iterator const_iterator; |
37 |
typedef typename vector_type::reverse_iterator reverse_iterator; |
38 |
typedef typename vector_type::const_reverse_iterator const_reverse_iterator; |
39 |
typedef typename vector_type::size_type size_type; |
40 |
typedef typename vector_type::difference_type difference_type; |
41 |
|
42 |
iterator begin () { return items.begin (); } |
43 |
iterator end () { return items.end (); } |
44 |
const_iterator begin () const { return items.begin (); } |
45 |
const_iterator end () const { return items.end (); } |
46 |
|
47 |
void push_back (value_type const &x) { return items.push_back (x); } |
48 |
|
49 |
reference front () { return items.front (); } |
50 |
const_reference front () const { return items.front (); } |
51 |
reference back () { return items.back (); } |
52 |
const_reference back () const { return items.back (); } |
53 |
|
54 |
reference at (size_type n) { return items.at (n); } |
55 |
const_reference at (size_type n) const { return items.at (n); } |
56 |
|
57 |
void pop_back () { return items.pop_back (); } |
58 |
|
59 |
size_type size () const { return items.size (); } |
60 |
bool empty () const { return items.empty (); } |
61 |
|
62 |
void erase (iterator pos) { return unordered_erase (items, pos); } |
63 |
void erase (size_type pos) { return unordered_erase (items, pos); } |
64 |
void erase (const_reference elt) { return unordered_erase (items, elt); } |
65 |
|
66 |
vector_type items; |
67 |
}; |