Как мне обновить перекрывающиеся индексы в boost :: multi_index_container?

Я использую 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 &) {});

1

Решение

Мне кажется, что не должно быть никаких проблем:

В документации упоминается:

Эффекты: Вызывает mod (e), где e — элемент, на который указывает позиция, и переставляет *position во все индексы multi_index_container. Перестановка успешна, если

  • индекс не уникален ИЛИ не существует другого элемента с эквивалентным ключом,
  • И перестановка допускается всеми остальными индексами multi_index_container.
    Если перестановка не удалась, элемент стирается.

Это означает, что все индексы обновляются. Обратите внимание, что все индексы могут в принципе отклонить редактирование. Вы можете использовать откат для защиты от потери данных.

1

Другие решения

Как отмечает @sehe, все индексы обновляются, поэтому вы в безопасности. Дополнительное наблюдение: ваш индекс № 2

ordered_non_unique<const_mem_fun<const_mem_fun<t_postal_address, string, &t_postal_address::street_name>>

на самом деле избыточно с индексом # 0 (тот, который основан на составном ключе): вы можете передать только строку (представляющую название улицы) в индекс # 0, и он будет вести себя точно так же, как индекс # 2. Это экономит ваше пространство и время выполнения. Волшебство за этим заключается в том, что при использовании составных ключей вам разрешено передавать частичная информация, вплоть до первого элемента составного ключа.

1

По вопросам рекламы [email protected]