How can I use a C++ unordered_set for a custom class?

后端 未结 4 1785
逝去的感伤
逝去的感伤 2021-02-04 07:32

How can I store objects of a class in an unordered_set? My program needs to frequently check if an object exists in this unordered_set and if it does,

4条回答
  •  迷失自我
    2021-02-04 07:48

    I agree to sjrowlinson that for your specific use case an std::unordered_map might be the better choice. However, if you want to stick to an unordered_set due to some reason, then you can also use a lambda expression instead of defining a hash function. But you also have to provide a comparison function (equal) to make your code working. If you want two node instances to be equal if they have the same node_id, then you can use the following code:

    auto hash = [](const node& n){ return std::hash()(n.node_id); };
    auto equal = [](const node& n1, const node& n2){ return n1.node_id == n2.node_id; };
    std::unordered_set set(8, hash, equal);
    

    However, if you want to use std::unordered_set::find(), then you cannot simply provide a string (e.g. "1001") to that function, because it expects a node object as parameter. The following code (which creates a temporary object) does the trick, though:

    set.insert(node("1001", 100));
    if (set.find(node("1001", 0)) != set.end())
        std::cout << "1001 found" << std::endl;
    

    Please note that the output 1001 found is printed, although the value of the inserted node is different from the value of the node given to the find() function (100 and 0, respectively). This is, because the comparison function equal only considers the node_id when checking for equality.

    Code on Ideone

提交回复
热议问题