Trong một chương trình C++ với Boost, tôi đang cố gắng để xây dựng một bản đồ có thứ tự mà phím tuples của đôi:Xây dựng một bản đồ có thứ tự với các bộ như phím
typedef boost::tuples::tuple<double, double, double, double> Edge;
typedef boost::unordered_map< Edge, int > EdgeMap;
Khởi tạo bản đồ hoàn OK, tuy nhiên, khi tôi cố gắng để cư nó với các phím và đánh giá cao
EdgeMap map;
Edge key (0.0, 0.1, 1.1, 1.1);
map[key] = 1;
tôi gặp phải thông báo lỗi sau:
/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>&)’
Tôi đoán điều này là bởi vì tôi cần phải chỉ định một hàm băm cho các khóa tuple. Làm thế nào tôi có thể làm điều đó?
EDIT:
Tiếp theo gợi ý dưới đây, tôi đã viết thực hiện như sau:
#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;
}
Có thể rút ngắn nó?
Đối tăng 1.60.0, các "không gian tên tuple" cần được "tuples namespace" để lam cho no hoạt động. – Val
@Val: Tôi nghĩ rằng đó là trường hợp với tất cả các phiên bản trước đó quá thực tế; cảm ơn :) –
"Tôi chỉ chứng minh nó đúng, tôi chưa thử nghiệm nó." <- đó cũng là cách ưa thích của tôi để phát triển mã :-) –