[英]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
是一個關聯容器,其中包含一組有序的Key
類型的唯一對象。 排序是使用鍵比較 functionCompare
完成的。 搜索、刪除和插入操作具有對數復雜性。 集合通常實現為紅黑樹
請注意, 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::hash
或absl::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.