2017-06-13 86 views
0

我想存储一个结构到一个映射使用哈希函数的关键。在创建两个相同的对象时,我从散列函数获得了相同的密钥,但每个元素仍然插入到映射中。插入不从哈希函数检索密钥

这里是我的代码:

// Key 
struct GridrecordKey { 
    // Keys 
    double key1; 
    double key2; 
    ... 

    GridrecordKey() { 
     key1 = 0; 
     key2 = 0; 
     ... 
    } 

    bool operator==(const GridrecordKey &other) const { 
     return (key1 == other.key1 
      && key2 == other.key2); 
    } 
}; 

// Hash function 
struct GridrecordKeyHasher 
{ 
    std::size_t operator()(const GridrecordKey& k) const 
    { 
     using boost::hash_value; 
     using boost::hash_combine; 

     // Start with a hash value of 0 . 
     std::size_t seed = 0; 

     hash_combine(seed, hash_value(k.key1)); 
     hash_combine(seed, hash_value(k.key2)); 

     // Return the result. 
     return seed; 
    } 
}; 

// Record 
struct gridrecord { 
    double element1; 
    double element2; 
... 
}; 

样品我的主要程序:

int main() { 
     GridrecordKey key; // The key 
     gridrecord record; // The record 
     unordered_map<GridrecordKey, gridrecord, GridrecordKeyHasher> map; // The map 

     // Modify the key and insert record into map 
     key.key1 = 1; 
     map.insert({ key, record }); 

     // Keep the same key and try to insert another record into the map 
     key.key1 = 1; 

     // Here the record is added to the map while it should't as this 
     // key already exist 
     auto x = map.insert({ key, record }); 
    } 

提前感谢!

+0

你是什么意思,每个元素仍然插入?该行应该执行,尽管有重复键 –

+0

我的意思是,两个记录被添加到地图中,而应该只有一个,因为关键是相同的 – Batmax

+0

为什么说这两个记录都被添加?在一些情况下,请参阅下面的答案 –

回答

0

我编译你的代码,并打印,在您的地图元素的数,您插入两次相同的元素后:

std::cout << map.size() << std::endl; 
--> 1 

所以你的代码是你希望的运行/想要它。

您如何达到您认为插入2次的程度?

+0

我的结构实际上更复杂(包括指针)。也许问题来自 – Batmax

+0

@Batmax:然后请添加该代码。 –

0

问题是由于一个关键变量。它的类型是char [],比较函数工作不正常。使用strcmp()修复了这个问题。 谢谢!