#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
доступ только к вашим сохраненным объектам, если вы не используете функции обновления контейнера, после чего он может подключиться к вызову и настроить хэши «на лету».