00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020 #ifndef VECMAP_H
00021 #define VECMAP_H
00022
00023 #include <vector>
00024 #include <algorithm>
00025
00026 template <typename _Key, typename _Data, typename _Compare = std::less<_Key> >
00027 class vecmap
00028 {
00029 public:
00030
00031 typedef std::pair<_Key, _Data> value_type;
00032 typedef typename std::vector<value_type> sorted_vector;
00033 typedef typename sorted_vector::iterator iterator;
00034
00035 protected:
00036
00037 sorted_vector svec;
00038
00039 struct key_compare : _Compare {
00040 bool operator() (const value_type &a, const value_type &b) const {
00041 return _Compare::operator()(a.first, b.first);
00042 }
00043 };
00044
00045 key_compare kcomp;
00046 _Compare comp;
00047
00048 public:
00049
00050 iterator begin() { return svec.begin(); }
00051 iterator end() { return svec.end(); }
00052 unsigned size() { return svec.size(); }
00053 void clear() { svec.clear(); }
00054 void reserve(unsigned n) { svec.reserve(n); }
00055
00056 iterator lower_bound(const _Key &k) {
00057 value_type v;
00058 v.first = k;
00059 return std::lower_bound(begin(), end(), v, kcomp);
00060 }
00061
00062 iterator find(const _Key &k) {
00063 iterator it = lower_bound(k);
00064 if (it == end() || comp(k, it->first))
00065 return svec.end();
00066 return it;
00067 }
00068
00069 _Data &operator[](const _Key &k) {
00070
00071 iterator it = lower_bound(k);
00072 if (it == end() || comp(k, it->first)) {
00073 _Data d;
00074 it = svec.insert(it, value_type(k, d));
00075 return it->second;
00076 }
00077 return it->second;
00078 }
00079
00080 std::pair<iterator,bool> insert(const value_type &val) {
00081
00082 std::pair<iterator, bool> ret;
00083 iterator it = lower_bound(val->first);
00084 if (it == end() || comp(val->first, it->first)) {
00085 ret.first = insert(it, val);
00086 ret.second = true;
00087 return ret;
00088 }
00089 it->second = val->second;
00090 ret.first = it;
00091 ret.second = false;
00092 return ret;
00093 }
00094
00095 void erase(const _Key &k) {
00096 iterator it = find(k);
00097 if (it!=end()) svec.erase(it);
00098 }
00099 };
00100
00101 #endif