小心使用指針當做 unordered_set / unordered_map 的鍵

當我們試圖使用指針作爲哈希的鍵時, 要小心下面的情況:

#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_sharednew 創建了一個新的對象

當然make_shared內部也是包裝了new

new的調用過程包括:

  1. 調用operator new分配一塊新的內存
  2. 在其中調用構造函數進行初始化

甚至其重載版本placement new可以在指定內存上調用構造函數, 而不進行任何內存的分配

也就是說, 你的指針可能是指向了不同的內存, 所以是不同的鍵 (顯而易見的, 即使他們值一樣)

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章