當我們試圖使用指針作爲哈希的鍵時, 要小心下面的情況:
#include <set>
#include <map>
#include <vector>
#include <memory>
#include <utility>
#include <iostream>
#include <unordered_set>
#include <unordered_map>
using namespace std;
int main()
{
unordered_set<shared_ptr<int> > s1;
s1.insert(make_shared<int> (5));
s1.insert(make_shared<int> (5));
cout << s1.size() << endl;
unordered_set<int *> s2;
s2.insert(new int(5));
s2.insert(new int(5));
cout << s2.size() << endl;
}
他們的輸出結果, 都會是 2
爲什麼呢?
因爲make_shared
和 new
創建了一個新的對象
當然
make_shared
內部也是包裝了new
new
的調用過程包括:
- 調用
operator new
分配一塊新的內存 - 在其中調用構造函數進行初始化
甚至其重載版本
placement new
可以在指定內存上調用構造函數, 而不進行任何內存的分配
也就是說, 你的指針可能是指向了不同的內存, 所以是不同的鍵 (顯而易見的, 即使他們值一樣)