【发布时间】:2017-08-24 13:11:45
【问题描述】:
我有一个 Person 类,它有一个 name 属性 (std::string)。
我想创建一个查找表,一个std::unordered_map,所以我可以通过他们的名字找到一个Person。但是,给定一个Person,我也希望能够得到他们的名字。
这需要将name 存储两次 - 一次作为地图的键,一次在人员对象中,如下面的代码所示。
由于我一次将许多Persons 加载到内存中,因此我不希望将它们的名称存储两次的开销。
我尝试在 Person 类中使用指向键的引用/指针,但这会产生问题,因为地图在修改时似乎会重新排列其数据,并且引用变得无效。
我也尝试过使用std::unordered_set,但这意味着我每次想要执行查找时都需要构造一个完整的Person 对象。
有没有办法让无序映射的key和value共享相同的数据?
#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中吗? -
在这个假设的例子中,不,但假设我这样做。
-
@cz - 为什么不使用带有自定义哈希的无序集呢?无论如何,这似乎就是您所追求的。
-
你也可以使用排序向量。
-
除非 person 对象很大,否则使用
unordered_set可能是您最好的选择。它是节省空间的,仍然是 O(1)。默认构造一些字段,包括向量和字符串之类的东西,非常便宜。
标签: c++ c++11 unordered-map stdmap