Я использую Boost 1.48.0, и у меня нет возможности обновить.
Я построил multi_index_container с индексами, которые имеют перекрывающиеся критерии. Как действуют индексы, использующие те же критерии индексации, что и в следующем примере? Последняя строка примера кода ссылается на то, что я прошу.
struct street_address_key : composite_key<
t_postal_address
, const_mem_fun<const_mem_fun<t_postal_address, string, &t_postal_address::street_name>>
, const_mem_fun<const_mem_fun<t_postal_address, long, &t_postal_address::house_number>>
, const_mem_fun<const_mem_fun<t_postal_address, string, &t_postal_address::city>>
, const_mem_fun<const_mem_fun<t_postal_address, string, &t_postal_address::state>>
, const_mem_fun<const_mem_fun<t_postal_address, long, &t_postal_address::zip_code>>
> {};
multi_index<
t_postal_address
indexed_by<
ordered_unique<street_address_key>
, ordered_non_unique<const_mem_fun<t_postal_address, string, &t_postal_address::name>>
, ordered_non_unique<const_mem_fun<const_mem_fun<t_postal_address, string, &t_postal_address::street_name>>
, ordered_non_unique<const_mem_fun<const_mem_fun<t_postal_address, long, &t_postal_address::house_number>>
, ordered_non_unique<const_mem_fun<const_mem_fun<t_postal_address, string, &t_postal_address::city>>
, ordered_non_unique<const_mem_fun<const_mem_fun<t_postal_address, string, &t_postal_address::state>>
, ordered_non_unique<const_mem_fun<const_mem_fun<t_postal_address, long, &t_postal_address::zip_code>>
>
> t_address_book;
...
t_address_book::nth_element<0>::type::iterator address_iter = book.find(some_address_tuple);
book.modify(address_iter, modify_city_method);
auto city_range = book.get<4>().equal_range( \*???*\ );
Индекс города использует те же критерии, что и street_address_key. Как я понимаю, изменение с помощью street_address_key обеспечит надлежащее обновление индекса. Но каково состояние «городского» индекса? Был ли он обновлен, чтобы отразить изменение названия города? Или это в сломанном состоянии? Могу ли я найти тот же индекс адресов со старым городом? Нужно ли обновлять этот индекс отдельно? Могу ли я вызвать модификатор no-op для обновления индекса?
// Presume I have the city element from the index.
// Is this supposed to update the city index after it was modified above?
book.get<4>().modify(city_iter, [](t_postal_address &) {});
Мне кажется, что не должно быть никаких проблем:
В документации упоминается:
Эффекты: Вызывает mod (e), где e — элемент, на который указывает позиция, и переставляет
*position
во все индексы multi_index_container. Перестановка успешна, если
- индекс не уникален ИЛИ не существует другого элемента с эквивалентным ключом,
- И перестановка допускается всеми остальными индексами multi_index_container.
Если перестановка не удалась, элемент стирается.
Это означает, что все индексы обновляются. Обратите внимание, что все индексы могут в принципе отклонить редактирование. Вы можете использовать откат для защиты от потери данных.
Как отмечает @sehe, все индексы обновляются, поэтому вы в безопасности. Дополнительное наблюдение: ваш индекс № 2
ordered_non_unique<const_mem_fun<const_mem_fun<t_postal_address, string, &t_postal_address::street_name>>
на самом деле избыточно с индексом # 0 (тот, который основан на составном ключе): вы можете передать только строку (представляющую название улицы) в индекс # 0, и он будет вести себя точно так же, как индекс # 2. Это экономит ваше пространство и время выполнения. Волшебство за этим заключается в том, что при использовании составных ключей вам разрешено передавать частичная информация, вплоть до первого элемента составного ключа.