簡體   English   中英

調用 'unordered_set&lt; 向量的隱式刪除的默認構造函數<int> &gt;'</int>

[英]Call to implicitly-deleted default constructor of 'unordered_set< vector<int> >'

似乎當我嘗試定義一個 unordered_set 向量時,我收到一條錯誤消息:“調用unordered_set< vector<int> >的隱式刪除的默認構造函數。” 當我定義一個常規(有序)集合時,這不會發生: set< vector<int> > 似乎我需要定義hash<vector<int>>以消除錯誤。

有誰知道為什么我只有在使用unordered_set時才會收到此錯誤? 兩種數據結構都不應該使用散列,那么為什么 unordered_set 需要自定義的 hash function? 事實上,為了對vector<int>數據結構進行排序,一個常規(有序) set不應該也需要一些自定義的比較器嗎?

這是因為 unordered_set 使用 std::hash 模板為其條目計算 hash 並且沒有 std::hash 對。 您必須定義自定義 hash 才能使用 unordered_set。

    struct vector_hash
{
    template <class T1, class T2>
    std::size_t operator () (std::pair<T1, T2> const &v) const
    {
        return std::hash<T1>()(v.size());    
    }
};

然后將您的 unordered_set 聲明為-

std::unordered_set< vector<int>, vector_hash> set;

這個hash function不好。 這只是一個例子。

兩種數據結構都不應該使用散列嗎

不,這是有記錄的,您可以隨時自行查找:

  • std::set

    std::set是一個關聯容器,其中包含一組有序的Key類型的唯一對象。 排序是使用鍵比較 function Compare完成的。 搜索、刪除和插入操作具有對數復雜性。 集合通常實現為紅黑樹

    請注意, Compare默認為std::less<Key> ,並且std::vector重載operator<

  • std::unordered_set ,用於比較

    無序集是一個關聯容器,其中包含一組 Key 類型的唯一對象。 搜索、插入和刪除具有平均恆定時間復雜度。

    在內部,元素沒有按任何特定順序排序,而是組織成桶。 元素放入哪個桶完全取決於其值的 hash

    並且 Hash 類型參數默認為std::hash<Key> 這有一個標准庫類型的特化列表,並且std::vector不包含在該列表中。

不幸的是,對於std::vector沒有std::hash的一般特化。 std::vector<bool>只有一個特化,這不是很有幫助:

int main()
{
    std::hash<std::vector<bool>> hash_bool;  // ok
    std::hash<std::vector<int>> hash_int;  // error
}

演示

恕我直言的原因是沒有標准的方法來組合散列。 因為您必須組合所有元素的哈希值才能為整個向量構造 hash。 但是為什么沒有標准的方法來組合哈希——這是個謎。

您可以使用boost::hashabsl::Hash代替,例如:

unordered_set<vector<int>, boost::hash<vector<int>>>

請注意,由absl::Hash計算的 hash 代碼不能保證在程序的不同運行中保持穩定。 這可能是一個好處(如果您的目標是安全),也可能是一個缺點(如果您的目標是可重復性)。

我的回答與std::vector問題沒有直接關系,但在我的情況下,我在std::string上出現“調用隱式刪除的默認構造函數”錯誤,只是因為我沒有包含<string> header 文件.

我的意思是當unordered_map用於前向聲明的類型時,可能會發生該錯誤:

#include <unordered_map>
#include <string_view>
//#include <string>

int main()
{
    auto m = std::unordered_map<std::string, int>{};
}

set 使用自平衡樹,而 unordered_set 使用純散列。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM