Inserting into an unordered_set with custom hash function

后端 未结 2 1205
陌清茗
陌清茗 2020-11-30 04:40

I have the following code to make an unordered_set. This compiles fine.

struct Interval {
  unsigned int begin;
  unsigned int e         


        
2条回答
  •  -上瘾入骨i
    2020-11-30 05:28

    I think, Andy Prowl perfectly fixed the problems with your code. However, I would add the following member function to your Interval, which describes what makes two intervals identical:

    std::string getID() const { return std::to_string(b) + " " + std::to_string(e) + " " + std::to_string(proteinIndex); }
    

    Please note, that I also followed Andy Prowl's suggestion and renamed the members begin to b and end to e. Next, you can easily define the hash and comparison functions by using lambda expressions. As a result, you can define your unordered_set as follows:

    auto hash = [](const Interval& i){ return std::hash()(i.getID()); };
    auto equal = [](const Interval& i1, const Interval& i2){ return i1.getID() == i2.getID(); };
    std::unordered_set test(8, hash, equal);
    

    Finally, for reasons of readability, I converted your for loop into a range-based for loop:

    std::list concat {{1, 2, false, 3, 4}, {2, 3, false, 4, 5}, {1, 2, true, 7, 4}};
    
    for (auto const &i : concat)
        test.insert(i);
    
    for (auto const &i : test)
        std::cout << i.b << ", " << i.e << ", " << i.updated << std::endl;
    

    Output (I just printed first three members of each Interval):

    2, 3, 0
    1, 2, 0

    As you can see, there are only two intervals printed. The third one ({1, 2, true, 7, 4}) was not inserted to concat, because its b, e, and proteinIndexare equal to that of the first interval ({1, 2, false, 3, 4}).

    Code on Ideone

提交回复
热议问题