連想コンテナ(2)
超適当なバージョンを作成してみる.
template< typename T , typename Key = int > class AssocVector { private: typedef T DataType; typedef Key KeyType; typedef std::pairItem; 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(); } };