與升壓C++程序無序的地圖,我想建立一個無序的地圖,它的鍵是雙打的元組:建設有元組作爲鍵
typedef boost::tuples::tuple<double, double, double, double> Edge;
typedef boost::unordered_map< Edge, int > EdgeMap;
初始化地圖完成後確定,但是,當我試着用鑰匙來填充它和值
EdgeMap map;
Edge key (0.0, 0.1, 1.1, 1.1);
map[key] = 1;
我遇到以下錯誤消息:
/usr/include/boost/functional/hash/extensions.hpp:176: error: no matching function for call to ‘hash_value(const boost::tuples::tuple<double, double, double, double, boost::tuples::null_type, boost::tuples::null_type, boost::tuples::null_type, boost::tuples::null_type, boost::tuples::null_type, boost::tuples::null_type>&)’
我認爲這是因爲我需要指定元組鍵的哈希函數。我怎樣才能做到這一點?
編輯:
按照下面的建議,我寫了下面的實現:
#include <boost/tuple/tuple.hpp>
#include <boost/unordered_map.hpp>
typedef boost::tuples::tuple<double, double, double, double> Edge;
struct ihash
: std::unary_function<Edge, std::size_t>
{
std::size_t operator()(Edge const& e) const
{
std::size_t seed = 0;
boost::hash_combine(seed, e.get<0>());
boost::hash_combine(seed, e.get<1>());
boost::hash_combine(seed, e.get<2>());
boost::hash_combine(seed, e.get<3>());
return seed;
}
};
struct iequal_to
: std::binary_function<Edge, Edge, bool>
{
bool operator()(Edge const& x, Edge const& y) const
{
return (x.get<0>()==y.get<0>() &&
x.get<1>()==y.get<1>() &&
x.get<2>()==y.get<2>() &&
x.get<3>()==y.get<3>());
}
};
typedef boost::unordered_map< Edge, int, ihash, iequal_to > EdgeMap;
int main() {
EdgeMap map;
Edge key (0.0, 0.1, 1.1, 1.1);
map[key] = 1;
return 0;
}
是否有可能縮短呢?
升壓1.60.0中,「命名空間的元組」應該是「命名元組」來讓它起作用。 – Val 2016-03-14 15:51:10
@Val:我認爲以前的所有版本都是如此。謝謝:) – 2016-03-14 15:52:53
「我只證明它是正確的,我沒有測試過它。」 < - 這也是我開發代碼的首選方式:-) – 2017-04-03 01:05:32