Удаление элемента карты по значению - PullRequest
5 голосов
/ 28 мая 2009

Я буду держать это краткое.

Я пытаюсь сохранить карту между строками и указателями объектов, и поэтому я использую std :: map. У меня есть менеджер, который является глобальным классом, который отслеживает карту, и всякий раз, когда вызывается деструктор объекта, он сообщает менеджеру, что он был удален.

Единственный способ, которым я могу придумать, - это поиск объекта по карте. Есть ли эффективное решение STL для этой проблемы? Существует ли карта, которая также эффективна при поиске по ключу?

Ответы [ 3 ]

8 голосов
/ 28 мая 2009

Нет, не существует эффективного способа сделать это с помощью std :: map, кроме итерации по сравнению значений.

Однако большую часть времени ключ для значения вычисляется из самого значения. Например, используя в качестве ключа свойство Name объекта Person. Может ли менеджер хранить список пар ключ / значение в отличие от самого значения. Это решит вашу проблему без необходимости переписывать новый алгоритм.

Или же вы можете сохранить обратную карту в классе менеджера. По сути значение для ключа. Таким образом, вы могли бы использовать его для вычисления ключа для последующего удаления.

4 голосов
/ 28 мая 2009

Просмотр документации SGI для STL ,

Карта имеет важное свойство, вставка нового элемента в карту не делает недействительными итераторы, которые указать на существующие элементы. Стирание элемент из карты также не признать недействительными любые итераторы, кроме Конечно, для итераторов, которые на самом деле указать на элемент, который в настоящее время стерта.

Таким образом, вы можете сохранить итератор на карте внутри вашего объекта и использовать его как ключ поиска в постоянном времени, когда вам нужно удалить его запись.

1 голос
/ 28 мая 2009

Взгляните на Boost Multi-Index Containers библиотека.

...