有什么好方法可以使用 unordered_map 以便您可以在恒定时间内通过成员变量访问对象(平均情况)?以下示例具有此功能,但需要将每个名称Person
复制为 Key:
#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
它自己,而不是 apair<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
可以巧妙地做到这一点的模板类呢?