C ++ unordered_map阻止字符串键的内存重新分配

时间:2014-07-01 11:56:01

标签: c++ stl unordered-map

我正在创建一个unordered_map(C ++ STL)。键是std :: string类型,值是指向类X的对象的指针。 字符串键实际上是对象本身的名称,并将作为实例变量存储在该类的对象中。 有没有办法让我在unordered_map中插入键值对,以便它不为键分配内存?

我提出了以下解决方案 - >

class X
{
public:
    const string name;
    X(char * c_name) : name(c_name) {}
};

unordered_map<string, X *> x_store;
X *a = new X("some_name"); 
x_store.insert(make_pair(a -> name, a))

但我相信字符串对象将被复制。

1 个答案:

答案 0 :(得分:3)

您不能让unordered_map依赖您的密钥:它必须存储自己的副本,因为您可能会更改X类中的字符串。

但是,您不需要使用地图 - 在您的情况下看起来unordered_set就足够了,具有一些自定义相等和散列函数:

auto my_hash = [](X const& x) {
    return std::hash<std::string>()(x.name);
};
auto my_eq = [](X const& x, X const& y) {
    return std::equal_to<std::string>()(x.name, y.name);
};
std::unordered_set<X,my_hash,my_eq> mySet;

现在,密钥信息存储在X对象中,该对象存储在mySet内。当然,您无法通过字符串键查询集合,但您可以使用find和&#34;查询对象&#34;实现相同的结果:

X query("abc"); // Set the name to "abc"
X *current = mySet.find(query);
if (current) {
    cout << current->name << endl; // Will print "abc"
} else {
    cout << "Not found" << endl;
}