Есть ли хороший способ использовать unordered_map, чтобы вы могли обращаться к объектам с помощью переменной-члена в постоянное время (средний случай)? В следующем примере эта функциональность, но требует, чтобы имя каждого Person
дублироваться в качестве ключа:Использование unordered_map, где Key является членом T
#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
необходимо будет Person
себя, вместо pair<string, Person>
и 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
шаблона класса, который может сделать это аккуратно?
Я не знаю, правильно ли я понял вопрос. '' Unordered_set' является контейнером, который вы ищете? – Naveen
Я редактировал вопрос, чтобы дать идеалистическую часть кода. Я не считаю, что 'unordered_set' соответствует этой спецификации (по крайней мере, не с ее самым основным использованием). –
Назовите меня сумасшедшим, но как насчет использования Boost.bimap, где вы делаете правую сторону 'unordered_multimap'? Затем вы получаете поиск справа налево в сложности этого контейнера. –