Преобразовать ссылку на объект в итератор STL - PullRequest
0 голосов
/ 24 декабря 2011

Я использую std :: multimap <> и передаю указатель на элемент (T *) на компонент, написанный на C.

Когда компонент хочет удалить объект, который он вызывает обратно в C ++ с указателем, я не уверен, есть ли способ преобразовать T * в std :: multimap <> :: iterator, чтобы я мог вызвать стереть ().

Есть идеи?

Ответы [ 3 ]

3 голосов
/ 24 декабря 2011

Если вы можете определить ключ по предмету, вы можете использовать equal_range, чтобы получить все возможные совпадения, а затем вызвать find для этого диапазона.

Если нет способа перейти от элемента к его ключу (редко, но возможно), то можно перечислить всю мультикарту (от begin () до end ()) и удалить тот, который соответствует. Надеюсь, это будет редкая операция, так как это O (N).

0 голосов
/ 24 декабря 2011

Помните, что мультикарта - это набор пар ключ-значение.Похоже, ваш T* является значением , и вам нужен эффективный способ получить его ключ , чтобы вы могли удалить его.Вы рассматривали Boost.Bimap ?Эта библиотека позволяет эффективно отображать оба пути.Тогда будет просто взять T* из вызывающего кода, найти ключ и стереть его.

0 голосов
/ 24 декабря 2011

Не путайте указатели и итераторы. Иногда (например, массивы) указатель может функционировать как итератор. Но это не обязательно.

Итераторы в C ++ обычно перегружают оператор *, называемый «оператор разыменования». Это делает их похожими на указатели C еще больше, когда они технически могут совпадать или не совпадать.

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

...