Tôi bắt đầu sử dụng lớp unordered_set
từ không gian tên tr1
để tăng tốc truy cập vào đồng bằng (dựa trên cây) STL map
. Tuy nhiên, tôi muốn lưu trữ các tham chiếu đến các chuỗi ID trong tăng (boost::thread::id
) và nhận ra rằng API của các số nhận dạng đó mờ đục đến nỗi bạn không thể có được một mã băm của nó.tr1 :: hash for boost :: thread :: id?
Đáng ngạc nhiên, tăng cường thực hiện các phần của tr1
(bao gồm hash
và unordered_set
), nhưng nó không xác định một lớp băm có thể băm ID luồng.
Nhìn vào tài liệu của boost::thread::id
tôi thấy rằng ID chủ đề có thể xuất ra một dòng suối, vì vậy giải pháp của tôi để làm băm là loại:
struct boost_thread_id_hash
{
size_t operator()(boost::thread::id const& id) const
{
std::stringstream ostr;
ostr << id;
std::tr1::hash<std::string> h;
return h(ostr.str());
}
};
Đó là, serialize nó, áp dụng các hash đến chuỗi kết quả. Tuy nhiên, điều này có vẻ kém hiệu quả hơn so với sử dụng STL map<boost::thread::id>
.
Vì vậy, câu hỏi của tôi: Bạn có tìm cách làm tốt hơn không? Có một sự mâu thuẫn rõ ràng trong cả tăng và tr1 không ép buộc sự tồn tại của một lớp học hash<boost::thread::id>
?
Cảm ơn.
+1 và cảm ơn câu trả lời của bạn. Trên thực tế, tôi nghĩ rằng đó là tốt nhất của tất cả, vì vậy tôi sẽ chấp nhận nó. Tôi không chắc làm thế nào "chuẩn" 'native_handle' và' native_handle_type' có liên quan sẽ có trong dài hạn. Cơ hội có vẻ là băm 'thread :: id' có thể được đưa vào trong một thời điểm hợp lý, vì có một số báo cáo chống TR1 vì không có nó hoặc nếu tôi nhớ rõ ... Tóm lại: cảm ơn, tôi đã không nghĩ về 'native_handle_type'. –