提升无序集不起作用

时间:2011-05-23 04:35:03

标签: c++ boost unordered-set

我是新手来提升。我正在尝试实现boost :: unorder_set。这是代码:

struct point {
int x;
int y;};
bool operator==(point const& p1, point const& p2) {
return p1.x == p2.x && p1.y == p2.y; 
}
struct point_hash {{
size_t operator()(point const& p) const
{
    size_t seed = 0;
    hash_combine(seed, p.x);
    hash_combine(seed, p.y);
    return seed;
}};
int main() {
point pt;
unordered_multiset<point,point_hash> points(pt);
}

我收到以下错误:

In instantiation of ‘boost::intrusive::do_pack<boost::intrusive::uset_defaults<point>, point_hash>’:
instantiated from ‘boost::intrusive::pack_options<boost::intrusive::uset_defaults<point>, point_hash, boost::intrusive::none, boost::intrusive::none, boost::intrusive::none, boost::intrusive::none, boost::intrusive::none, boost::intrusive::none, boost::intrusive::none, boost::intrusive::none, boost::intrusive::none, boost::intrusive::none>’
instantiated from ‘boost::intrusive::make_hashtable_opt<point, false, point_hash, boost::intrusive::none, boost::intrusive::none, boost::intrusive::none, boost::intrusive::none, boost::intrusive::none, boost::intrusive::none, boost::intrusive::none, boost::intrusive::none, boost::intrusive::none>’
instantiated from ‘boost::intrusive::make_unordered_multiset<point, point_hash, boost::intrusive::none, boost::intrusive::none, boost::intrusive::none, boost::intrusive::none, boost::intrusive::none, boost::intrusive::none, boost::intrusive::none, boost::intrusive::none, boost::intrusive::none>’
instantiated from ‘boost::intrusive::unordered_multiset<point, point_hash, boost::intrusive::none, boost::intrusive::none, boost::intrusive::none, boost::intrusive::none, boost::intrusive::none, boost::intrusive::none, boost::intrusive::none, boost::intrusive::none, boost::intrusive::none>’
boost_example.cpp:29:   instantiated from here
error: no class template named ‘pack’ in ‘struct point_hash’
boost_example.cpp: In function ‘int main()’:
boost_example.cpp:29: error: no matching function for call to ‘boost::intrusive::unordered_multiset<point, point_hash, boost::intrusive::none, boost::intrusive::none, boost::intrusive::none, boost::intrusive::none, boost::intrusive::none, boost::intrusive::none, boost::intrusive::none, boost::intrusive::none, boost::intrusive::none>::unordered_multiset(point&)’
note: candidates are: boost::intrusive::unordered_multiset<point, point_hash, boost::intrusive::none, boost::intrusive::none, boost::intrusive::none, boost::intrusive::none, boost::intrusive::none, boost::intrusive::none, boost::intrusive::none, boost::intrusive::none, boost::intrusive::none>::unordered_multiset(const boost::intrusive::unordered_multiset<point, point_hash, boost::intrusive::none, boost::intrusive::none, boost::intrusive::none, boost::intrusive::none, boost::intrusive::none, boost::intrusive::none, boost::intrusive::none, boost::intrusive::none, boost::intrusive::none>&)

我的实施有什么问题?提前完成。

2 个答案:

答案 0 :(得分:2)

unordered_multiset不能从单个元素构造(它没有这样的构造函数)。试试这个:

point pt;
boost::unordered_multiset<point,point_hash> points;
points.insert( pt );

您还需要正确包含标题:

#include <boost/unordered_set.hpp>

答案 1 :(得分:2)

你只需要将一个参数传递给unordered_multiset&lt;&gt;,boost :: hash会完成其余的工作,因为它知道如何散列自定义数据类型。

#include "boost/unordered_set.hpp"

struct point {
  int x;
  int y;
  // The following ctor isn't required, but I'm biased against garbage in tests
  point(int x_ = 0, int y_ = 0) : x(x_), y(y_) {}
};

bool operator==(point const& p1, point const& p2) {
  return p1.x == p2.x && p1.y == p2.y;
}

std::size_t hash_value(point const& p){
  std::size_t seed =0;
  boost::hash_combine(seed, p.x);
  boost::hash_combine(seed, p.y);
  return seed;
}

int main() {
  boost::unordered_multiset<point> points;
  struct point p;
  points.insert(p);
  points.insert(p);
  return 0;
}