簡體   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