Структура данных, которая владеет объектами и возвращает идентификаторы для них - PullRequest
0 голосов
/ 29 сентября 2010

Мне нужна структура данных, которая управляет целочисленными идентификаторами для T объектов (обычно std::string).Он должен поддерживать получение идентификатора для некоторого объекта и, наоборот, получать объект для некоторого идентификатора:

// if object not seen before: copies and stores object and returns
// new ID, otherwise just returns its ID
int Add(const T& obj);

// if obj not found: returns some specified `NotFound` ID,
// otherwise just returns its ID
int GetId(const T& obj);

// if id not contained: throws exception, 
// otherwise returns associated object
const T& GetObj(int id)

Он также должен владеть всеми этими T объектами, поэтому он внутренне распределяет новые объекты, сохраняет ихи удаляет их в деструкторе.

Есть комментарии?Как бы вы это реализовали?

Я использую эти два контейнера внутри;каждый указатель объекта хранится в обоих:

// quickly retrieve the ID
std::map<const T*, int, CompareByValue> Obj2IdMap;
// quickly retrieve the object, given an ID
std::vector<const T*> Id2ObjMap;

Существуют ли другие структуры данных, которые могут помочь?Или весь этот менеджер идентификаторов объектов уже доступен в некоторой библиотеке?

1 Ответ

1 голос
/ 29 сентября 2010

Он также должен владеть всеми этими T объекты, так что внутренне он выделяет новые объекты, хранит их и удаляет их в деструкторе.

Есть комментарии? Как бы вы реализовали что?

Я бы использовал boost shared_ptr для управления объектами.

Существуют ли другие структуры данных что может помочь? Или это целое Менеджер ID объекта уже доступен в какая-то библиотека?

Проверьте этот поток переполнения стека: Использование контейнеров STL для нескольких ключей . Я думаю, что это хорошее альтернативное решение для вашей проблемы, хотя, если честно, я использовал тот же самый подход во многих проектах.

...