繁体   English   中英

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

[英]C++ unordered_map prevent memory reallocation for string keys

我正在创建一个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))

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

你不能让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;
}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM