В стандартной библиотеке нет ничего, что могло бы поддержать ваш случай использования напрямую. Однако для этой цели вы можете использовать Boost.MultiIndexContainer. Что-то вроде этого:
typedef multi_index_container<
Record,
indexed_by<
ordered_non_unique<member<Record, decltype(Record::B), &Record::B>>,
hashed_unique<member<Record, decltype(Record::A), &Record::A>>
>
> RecordContainer;
(код предполагая правильные заголовки и using namespace
директивы для краткости).
Идея состоит в создании контейнера с двумя индексами, который гарантирует заказ на основе B
, а другой, который гарантирует уникальность на основе A
. decltype()
в коде могут быть заменены действительными типами A
и B
, которые вы знаете, но я этого не делаю.
Порядок индексов имеет незначительное значение, поскольку для удобства сам контейнер предлагает тот же интерфейс, что и его первый индекс. Тем не менее, вы всегда можете получить доступ к любому индексу, используя container.get()
.
Код не предназначен в качестве копия &. Вставить раствор, но в качестве отправной точки. Вы можете добавить настройки, индексные теги и т. Д. Подробнее см. В документации Boost.
Почему бы не использовать 'std :: set' и реализовать' operator <'в терминах' record :: B' и 'operator ==' в терминах 'record :: A'? –
@TheParamagneticCroissant Поскольку 'std :: set' не использует' == 'вообще? Это означает, что он позволит дублировать элементы по семантике OP. – Angew
@Angew [cppreference говорит мне] (http://en.cppreference.com/w/cpp/container/set/operator_cmp): «Ключ» должен отвечать требованиям «EqualityComparable», это неправильно? –