連想コンテナ(2)

超適当なバージョンを作成してみる.

template<
     typename T
   , typename Key = int
>
class AssocVector
{
private:
   typedef T   DataType;
   typedef Key   KeyType;

   typedef std::pair   Item;
   typedef std::vector< Item>   List;
   typedef typename List::iterator   Iterator;

   List   v;

   struct Compare {
      inline bool operator()(const Item& i0, const Item& i1)
            const {return i0.first<i1.first;}
      inline bool operator()(const Item& i, const KeyType& k)
            const {return i.first<k;}
      inline bool operator()(const KeyType& k,const Item& i)
            const {return k<i.first;}
   };

   Iterator findImpl( const KeyType key) {
      return std::lower_bound( v.begin(), v.end(), key, Compare() );
   }

   DataType   dummyResult;

public:
   AssocVector() : dummyResult() {}
   ~AssocVector() {}

   void SetDefault( DataType init) {
      dummyResult = init;
   }

   void Insert( KeyType key, DataType map) {
      Iterator it = findImpl(key);
      v.insert( it, Item(key, map));
   }

   bool IsExist( KeyType key) {
      Iterator it = findImpl(key);
      return (it!=v.end() && it->first==key)? true: false;
   }

   DataType Get( KeyType key) {
      Iterator it = findImpl(key);
      if (it!=v.end() && it->first==key) {
         return it->second;
      }
      return dummyResult;   // ダミーを返す
   }

   bool Remove( KeyType key) {
      Iterator it = findImpl(key);
      if (it!=v.end() && it->first==key) {
         v.erase( it);
         return true;
      }
      return false;
   }

   void Clear() {
      v.clear();
   }
};