Вы можете использовать набор для пары.
Сначала вы определите пару.Для пары необходим ключ в качестве первого элемента, а ваш экземпляр - во втором.
Например, предположим, у нас есть коллекция книг, и мы хотим сгруппировать их по автору:
typedef std::pair<Author *,Book *> AuthorBookPair;
Затем вы определяетенабор в этой паре:
typedef set<AuthorBookPair> BooksGroupedByAuthor;
Заполнение набора можно сделать следующим образом:
BooksGroupedByAuthor books;
books.insert (std::make_pair(book1->getAuthor(),book1));
books.insert (std::make_pair(book2->getAuthor(),book2));
books.insert (std::make_pair(book3->getAuthor(),book3));
books.insert (std::make_pair(book4->getAuthor(),book4));
Теперь вы можете просто искать книги автора с помощью методов lower_bound и upper_bound:
#define POINTER_SMALLEST 0x00000000
#define POINTER_LARGEST 0xffffffff
BooksGroupedByAuthor::const_iterator lowerbound = books.lower_bound(std::make_pair(myFavoriteAuthor,POINTER_POINTER));
BooksGroupedByAuthor::const_iterator upperbound = books.upper_bound(std::make_pair(myFavoriteAuthor,POINTER_POINTER));
Теперь просто перейдите между нижней и верхней границей, чтобы получить все книги от этого автора.
Этот прием основан на том факте, что я решил хранить указатели на книги, и что я знаюкакой самый маленький и самый большой указатель (для 64-битных приложений вам придется изменить это!).Я должен признать, что это не самый лучший трюк.
Немного лучшей альтернативой было бы хранить сами книги (если в вашем приложении разрешено делать копии этих экземпляров) и делать 2 конкретных экземпляра Book, которыепредставляют «самую маленькую книгу» и «самую большую книгу» соответственно.
Приятная особенность этого трюка заключается в том, что он позволяет добавлять больше измерений, если это необходимо.Например, вы можете добавить год в качестве второго измерения, а затем выбрать поиск книг только по автору или поиск книг по автору за определенный год.При использовании большего количества измерений кортежи из нового C ++ 0x могут стать удобными.
Этот прием также имеет то преимущество, что он защищает вас от добавления книги дважды.Если книга добавляется дважды, она все равно будет однажды в коллекции (если мы предположим, что автор книги никогда не изменится).Если бы вы использовали multi_map, вы могли бы добавить одну и ту же книгу дважды, что, вероятно, нежелательно.