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
ある必要があると考えています。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
でしょうか?