Как boost::multi_index работает с функциями-членами?

#c #c 11 #boost #multi-index #boost-multi-index

#c #c 11 #boost #многоиндексный #boost-многоиндексный

Вопрос:

Если у меня есть boost::multi_index следующим образом,

 typedef multi_index_container<
    employee,
    indexed_by<    
        hashed_unique<mem_fun<employee, std::string, amp;employee::getname> >,
        hashed_unique<mem_fun<employee, int, amp;employee::getage> >
    > 
> employee_set;
  

Я понимаю, что объекты класса «employees», которые вставляются в этот контейнер, хранятся таким образом, что их можно извлечь за O (1) время (в виде хэш-карты).

Как он будет сохранен, когда переменные-члены (имя, возраст) обновляются в ходе работы программы (например, с помощью чего-то вроде setname или setage) и по-прежнему хэшируются с использованием этих значений? Я что-то не так понимаю?

TIA

-R

Комментарии:

1. См. «заменить» и «изменить» в boost.org/doc/libs/1_61_0/libs/multi_index/doc/tutorial /…

Ответ №1:

Из документации:

Итераторы, предоставляемые каждым индексом, являются постоянными, то есть элементы, на которые они указывают, не могут быть изменены напрямую. Это соответствует интерфейсу std::set для упорядоченных индексов, но может стать неожиданностью для других типов, таких как упорядоченные индексы, которые моделируются по std::list образцу, где это ограничение не выполняется. Это, казалось бы, странное поведение обусловлено тем, как multi_index_container работают s; если бы элементам разрешалось изменять без разбора, мы могли бы вносить несоответствия в упорядоченные индексы multi_index_container без уведомления контейнера об этом. Модификация элемента правильно выполняется с помощью операций обновления любого индекса.

Другими словами, у вас есть const доступ только к вашим сохраненным объектам, если вы не используете функции обновления контейнера, после чего он может подключиться к вызову и настроить хэши «на лету».