Я хочу создать такую карту, как структура, чтобы разрешить поиск двумя клавишами, и будут строками, вот пример:
Myclass s;
Лицо p = s.find("Давид"); //поиск по имени
// OR
p = s.find("XXXXX"); // поиск по ID
я не хочу кодового решения, мне просто нужна помощь, чтобы начать работу, как структуры, которые я могу использовать для достижения того, что я хочу, помощь оценена парнями, это финальная неделя.
Поместите свои записи в вектор (или список). Добавьте указатель на объекты записи на две карты: одну с одним ключом и одну с другой.
Существует много разных способов достижения этой цели. Возникает вопрос: каковы сложности операций вставки, удаления и поиска, на которые вы нацелены?
std::map
реализуется как красно-черное дерево, которое обеспечивает невероятно быструю самобалансировку (вращение) и все упомянутые операции (поиск/поиск, вставка, удаление) со сложностью O(log(n))
. Обратите внимание, что это соответствует идее одного ключа.
С помощью двух клавиш вы не можете сохранять элементы отсортированными, потому что порядок, основанный на одном ключе, будет, скорее всего, отличаться от порядка, основанного на другом. Самый простой и естественный подход - хранить записи в одном контейнере и удерживать ключи, используемые этим контейнером, в двух разных структурах, один из которых оптимизирован для извлечения этого ключа, данного id
а другой для получения его name
.
Если есть ограничение на хранение всего в одном месте, в то время как вы хотите оптимизировать операцию поиска, которая будет поддерживать два разных ключа, тогда вы можете создать оболочку std::map<std::string, Person>
где каждый элемент будет (каждый раз под другим ключом), то есть что-то вроде:
std::map<std::string, Person> myContainer;
...
Person p;
std::string id = "1E57A";
std::string name = "David";
myContainer[id] = p;
myContainer[name] = p;
Я могу придумать 2 преимущества этого: O(log(2*n))
O(2*log(2*n))
id
и name
должны быть атрибутами Person
так что, когда вы найдете конкретный элемент с одним из этих ключей, вы сразу же получите другойname
должно быть id
какого-либо другого человека одновременно и наоборот (ни один id
должен быть name
какого-либо другого лица)O(log(2*n))
- это просто более точная оценка, которая явно выражает стоимость удвоения размера контейнера.
std::set_intersection
чтобы найти ответ.