2009-05-28 18 views
5

Będę trzymać to krótkie.Usunięcie elementu mapy według wartości

Próbuję zachować mapę między ciągami znaków i wskaźnikami obiektów, a jako takie używam std :: map. Mam menedżera, który jest globalną klasą, która śledzi mapę, a za każdym razem, gdy wywoływany jest destruktor obiektu, informuje menedżera, że ​​został usunięty.

Jedyny sposób, jaki mogę wymyślić, to przeszukać mapę obiektu. Czy istnieje skuteczne rozwiązanie STL tego problemu? Czy istnieje również mapa skuteczna w wyszukiwaniu według klucza?

Odpowiedz

8

Nie ma na to wydajnego sposobu na std :: map, poza iterowaniem poprzez porównywanie wartości.

Jednak przez większość czasu klucz wartości jest obliczany na podstawie samej wartości. Na przykład jako właściwość Name obiektu Person. Czy menedżer może przechowywać listę par klucz/wartość w przeciwieństwie do samej wartości. To rozwiązałoby twój problem bez konieczności przepisywania nowego algorytmu.

Lub alternatywnie można zachować odwrotną mapę na klasie menedżera. Zasadniczo wartość klucza. W ten sposób możesz go użyć do obliczenia klucza, aby później go usunąć.

+0

Dzięki! Nawet nie pomyślałem o tym, żeby obiekt przechowywał klucz. Zdecydowanie lepszym rozwiązaniem niż posiadanie drugiej mapy. –

+0

+1, usunę moją odpowiedź, ponieważ brzmi tak samo jak twoja. –

1

Zobacz bibliotekę Boost Multi-Index Containers.

+0

Należy pamiętać, że zarówno klucze, jak i wartości muszą być unikatowe, aby można było korzystać z mapy dwukierunkowej. std :: map wymaga tylko unikalnych kluczy. –

4

Patrząc na SGI's documentation for the STL,

mapa ma ważną właściwość, że wprowadzania nowego elementu na mapie nie unieważnia iteratory że punkt do istniejących elementów. Usunięcie elementu z mapy również nie powoduje unieważnienia żadnych iteratorów z wyjątkiem kursu dla iteratorów, które faktycznie wskazują na element, który jest wymazany.

Można więc przechowywać iterator na mapie wewnątrz obiektu i używać go jako klucza wyszukiwania stałego, gdy trzeba usunąć jego wpis.

Powiązane problemy