Building an unordered map with tuples as keys

前端 未结 6 1009
南方客
南方客 2021-02-01 05:40

In a C++ program with Boost, I am trying to build an unordered map whose keys are tuples of doubles:

typedef boost::tuples::tuple

        
6条回答
  •  春和景丽
    2021-02-01 06:00

    You need a bit of front matter. Because of the underlying implementation of boost::tuples::tuple, make Edge a structure to allow the overloads to resolve correctly. Otherwise, you'll get no matches for

    • boost::hash_value(const Edge &)
    • operator==(const Edge &, const Edge &)

    Code below:

    struct Edge {
      Edge(double x1, double x2, double x3, double x4)
        : tuple(x1,x2,x3,x4) {}
      boost::tuples::tuple tuple;
    };
    
    // XXX: less than ideal implementation!
    bool operator==(const Edge &a, const Edge &b)
    {
      return a.tuple.get<0>() == b.tuple.get<0>() &&
             a.tuple.get<1>() == b.tuple.get<1>() &&
             a.tuple.get<2>() == b.tuple.get<2>() &&
             a.tuple.get<3>() == b.tuple.get<3>();
    }
    
    // XXX: me too!
    std::size_t hash_value(const Edge &e)
    {
      std::size_t seed = 0;
      boost::hash_combine(seed, e.tuple.get<0>());
      boost::hash_combine(seed, e.tuple.get<1>());
      boost::hash_combine(seed, e.tuple.get<2>());
      boost::hash_combine(seed, e.tuple.get<3>());
      return seed;
    }
    
    typedef boost::unordered_map< Edge, int > EdgeMap;
    

提交回复
热议问题