2014-09-02 2 views
0

Я использую std :: map, чтобы сохранить некоторые вещи, ключ Guid *.Заменить ключ на std :: map

typedef boost::tuple<c_ptr, handler_ptr> ctuple; 
typedef std::map<GUID *, ctuple> c_map; 

Мой вопрос: ли у меня способ изменить ключ элемента в станд :: карта? КРОМЕ скопировать существующие данные в новый элемент, который есть новый ключ и удалить предыдущий/старый элемент (со старым ключом)

Благодаря

+0

См. Также [Как изменить значения ключа в контейнере std :: map] (http://stackoverflow.com/q/3884572/96780). –

+1

Кроме копий? * Переместите * данные в новый элемент :-) –

+0

Предполагая, что карта внутренне реализована с использованием сбалансированного двоичного дерева, просто «изменение» ключевых данных приведет к уничтожению цели и порядка дерева. Операции, которые вы указали, необходимы для создания нового элемента и удаления/перебалансировки дерева. –

ответ

3

У меня есть способ изменить ключ элемента на std :: map?

Номер

Вот почему value_type из std::map<Key, Value> является std::pair<Key const, Value> (уведомление const применяется к Key).

+0

Таким образом, единственный способ: ctuple tmp = c_map [oldKey]; c_map [NewKey] = tmp; c_map.erase [oldKey]; – Joseph

+0

@Joseph Да, что-то в этом роде. В C++ 11 вы можете использовать 'std :: move' для перемещения значения вместо копирования, если его относительно дорого копировать. –

+0

спасибо, я боюсь, что std :: move здесь не поможет. переместитесь с одной карты на другую да, но переместите данные между значениями на одной карте, я не вижу, чтобы было лучше использовать перемещение. – Joseph

Смежные вопросы