Если свойства, по которым вы хотите искать ссылки, меняются не очень часто, вы можете выбрать std::list<Link>
в качестве основного контейнера для хранения объектов ссылок.Затем для каждого критерия у вас есть один std::map
, который отображает значение на итератор, указывающий на список.Например,
typedef std::list<Link> LinkList;
LinkList links = ...;
std::map<std::string, LinkList::iterator> linkByName;
std::map<unsigned int, LinkList::iterator> linkByPopularity;
Приятной особенностью std::list
является то, что он обладает очень сильными гарантиями аннулирования итераторов (в основном, ваш итератор в списке становится недействительным только в случае удаления элемента из списка).
Чтобы эти структуры постоянно обновлялись, вы можете обернуть все это в оболочку 'LinkCollection' или около того.