[英]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.