Есть ли хороший способ использовать unordered_map, чтобы вы могли получать доступ к объектам с помощью переменной-члена в постоянное время (средний случай)? В следующем примере есть эта функция, но требуется, чтобы имя каждого Person
дублировалось в качестве ключа:
#include <iostream>
#include <string>
#include <unordered_map>
#include <algorithm>
class Person {
public:
Person() : name_("") {}
Person(const std::string& name) : name_(name) {}
std::string getName() const { return name_; }
void kill() const { std::cout << name_ << " is dead!" << std::endl; }
private:
std::string name_;
};
int main(int argc, const char* argv[]) {
Person p1("dave");
Person p2("bob");
std::unordered_map<std::string, Person> map = {
{p1.getName(), p1}, // Duplicating the
{p2.getName(), p2} // keys here
};
map["dave"].kill();
return 0;
}
Я думаю, что каким-то образом value_type
должен быть Сам человек
вместо пары
и unordered_map
должен знать, что использовать Person :: getName
при хешировании и доступе объекты.
Идеальное решение позволило бы мне настроить unordered_map
(или unordered_set
, если он более подходит для работы), который знает, как использовать Person :: getName
, чтобы получить ключ каждого объекта. Затем я мог бы вставить их, просто указав объект (и не имея ключа, потому что он знает, как получить ключ), и получить к ним доступ, указав ключи, которые будут сравниваться с возвращаемым значением Person :: getName
.
Что-то вроде:
// Pseudocode
std::unordered_map<Person, Person::getName> map = {p1, p2};
map["dave"].kill();
Итак, можно ли создать экземпляр класса шаблона unordered_map
, который может делать это аккуратно?