我正在创建一个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))
但我相信字符串对象将被复制。
答案 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;
}