我不理解正確的東西。我的印象是unordered_set不會允許基於它們的散列的重複元素。std :: unordered_set允許插入重複記錄
我有一個結構,其中的std ::散列,這似乎允許重複的特殊化,雖然我已經手動檢查它
AddEdge (const std::shared_ptr<Relation> relation, const std::shared_ptr<Concept> concept)
{
auto edge = std::make_shared<Edge>((Edge){ relation, concept });
auto res = _edges.insert (edge);
return res.second;
}
一個重載函數不完全相同,但對於反轉參數
這是邊沿結構被散列:
namespace std
{
template<> struct hash<shared_ptr<Edge>>
{
size_t operator()(const shared_ptr<Edge> & ptr) const
{
size_t from = 0;
size_t to = 0;
if (auto node = std::dynamic_pointer_cast<Concept>(ptr->from))
from = hash<shared_ptr<Concept>>()(node);
else if (auto node = std::dynamic_pointer_cast<Relation>(ptr->from))
from = hash<shared_ptr<Relation>>()(node);
if (auto node = std::dynamic_pointer_cast<Concept>(ptr->to))
to = hash<shared_ptr<Concept>>()(node);
else if (auto node = std::dynamic_pointer_cast<Relation>(ptr->to))
to = hash<shared_ptr<Relation>>()(node);
return hash<size_t>()(from + to);
}
};
}
而且在舉行的容器:
std::unordered_set<std::shared_ptr<Edge>> _edges;
當我這樣做:
graph2->AddEdge(sea_node, is_node);
graph2->AddEdge(is_node, blue_node);
我得到:
Edge [sea,is] hash = 10017731961838884781
Edge [is,blue] hash = 11178184051384786808
我嘗試第二次完全一樣,我也得到相同的哈希值,但是,當我檢查的邊緣,我現在有4條邊而不是2條。
我在做什麼錯?
編輯:類概念&關係有同樣的散列函數:
namespace std
{
template<> struct hash<shared_ptr<Concept>>
{
size_t operator()(const shared_ptr<Concept> & ptr) const
{
return hash<string>()(ptr->asToken()->value()) + hash<int>()(ptr->TokenIndex()) + hash<string>()("Concept");
}
};
}
更interestignly,當我從加邊我的輸出,產生相同的哈希值,但它的重複邊緣添加。
請看[testcase](http://sscce.org)。 – 2014-10-16 23:17:23
我哈希指針具有完全相同的哈希函數(請參閱編輯)。不幸的是,我不能創建一個測試用例,太多的類涉及一個小型自包含示例。 – 2014-10-16 23:21:07
創建測試用例的關鍵是_abstract away_或_remove_這些類。除非您的問題依賴於高度本地化的因素,例如特殊硬件或瘋狂的海森堡,否則構建一個小型自包含示例絕不是不可能的。你應該把它作爲你自己調試的第一步之一,早在尋求幫助之前......我們甚至你怎麼知道所有那些「太多的類」都不會導致問題? – 2014-10-16 23:23:01