Person
的类,其中包含一个 name
属性(std::string
类型)。我想要创建一个查找表,即
std::unordered_map
,以便通过名字查找 Person
。然而,如果已经有一个 Person
对象,我也想要能够获取他们的名字。这需要将
name
存储两次 - 一次作为 map 的键,并将其存储在 person 对象内部,如下面的代码所示。由于我一次加载了许多
Person
,我不想再将他们的名字存储两次。我尝试过在
Person
类中使用引用/指针来代替键,但是当 map 被修改时,它似乎会重排数据,从而使引用失效。我还尝试过使用
std::unordered_set
,但这意味着每次执行查找时都需要构造一个完整的 Person
对象。有没有办法使 unordered map 的键和值共享相同的数据?
#include <iostream>
#include <unordered_map>
class Person
{
private:
const std::string _name;
public:
Person( const std::string& name ) : _name( name )
{
}
const std::string& get_name() const
{
return _name;
}
};
int main()
{
auto my_set = std::unordered_map<std::string, std::shared_ptr<Person>>();
my_set.insert( { "alice", std::shared_ptr<Person>( new Person( "alice" )) } );
my_set.insert( { "bob", std::shared_ptr<Person>( new Person( "bob" )) } );
my_set.insert( { "charlie", std::shared_ptr<Person>( new Person( "charlie" )) } );
std::cout << my_set.find( "bob" )->second->get_name() << std::endl;
return 0;
}
name
存储在Person
中吗? - Vittorio Romeostd::set
,但这是不同的O(n)。 - Slavaunordered_set
可能是最好的选择。它具有高效的空间利用率,仍然是O(1)的。默认构造一些字段,包括向量和字符串之类的东西,非常便宜。 - Nir Friedmanunordered_map
内部,而是指向栈上的临时对象。你应该在insert()
或emplace()
之后才设置或更新它。 - Arne Vogel