連想コンテナ(3)
同じkeyを持っているデータを登録した場合に,前のデータを上書きしたいんだけど,それだと前のデータを削除するやつがいない.かといっていちいち前のデータがあるか確認して削除,その後に挿入となるとvectorなのでコストが掛かってしまう.ということで削除処理を登録してみることにした.
// ポインタなら削除.ポインタでなければ削除しない. templatestruct PtrDeletor { inline static void Deletor(T& t) {}}; template struct PtrDeletor { inline static void Deletor(T* t) { delete t;}}; //template //struct PtrDeletor { inline static void Deletor(T& t) {}}; // T&&を避けるためにT&も特殊化しておく? // 常に何もしない template< class T> struct NoneDeletor { inline static void Deletor(T& t) {}}; template< typename T , typename Key = int , template class Deletor = PtrDeletor > class AssocVector { : void Insert( KeyType key, DataType data) { Iterator it = findImpl(key); if (it!=v.end() && it->first==key) { // 同じkeyが存在するので上書きする // 削除処理を呼び出す Deletor ::Deletor( it->second); *it = Item(key, data); } else { v.insert( it, Item(key, data)); } }
Remove,Clearでも同様の処理を追加する.
しかしなぜ,STLのコンテナは削除処理を持たないのか?
削除処理を持たせずに上手く処理するにはスマートポインタを使わないといけない?