C++无序映射阻止字符串键的内存重新分配



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

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

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))

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

不能让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和"查询对象"来获得相同的结果:

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;
}

最新更新