根据documentation,boost::thread::id
可以被认为是每个正在运行的线程的唯一,并且可以在std::set
和std::map
等容器中使用(因为{{为<
)重写了1}}运算符。
我的问题是我想使用thread::id
作为thread::id
的密钥,但是它要求密钥是“可散列的”(即支持散列到boost::unordered_map
})。由于thread :: id的所有实现细节都被隐藏了,所以我认为没有任何我可以使用的东西。
所以我的问题是 - 是否可以使用thread :: id作为unordered_map的键?
答案 0 :(得分:5)
您可以使用流媒体功能:
struct Hasher
{
size_t operator()(const boost::thread::id& id)
{
std::ostringstream os; os << id; return hash(os.str());
}
};
课程的摘录很少,以便其他人可以看到可能的内容:
class thread::id
{
public:
id();
bool operator==(const id& y) const;
bool operator!=(const id& y) const;
bool operator<(const id& y) const;
bool operator>(const id& y) const;
bool operator<=(const id& y) const;
bool operator>=(const id& y) const;
template<class charT, class traits>
friend std::basic_ostream<charT, traits>&
operator<<(std::basic_ostream<charT, traits>& os, const id& x);
};
答案 1 :(得分:2)
你有多少线程?除非你有超过几百个,否则不太可能
具有大量哈希的unordered_map
(并且哈希很重,特别是基于std::stringstream
)将比std::map
快。不要伪造std::map
具有相当小的常数的对数复杂度。
如果您有数百个线程,那么您的应用程序可能存在问题。
答案 2 :(得分:2)
为什么需要继续使用字符串?你可以使用
size_t operator()(const boost::thread::id& id)
{
using boost::hash_value;
return hash_value(id);
}
答案 3 :(得分:0)
文档说它可以写入流。将其写入std::ostringstream
并散列str()
结果。虽然未指定输出格式,但它对于给定的ID是唯一的,并且对于给定的程序运行是唯一的(只要线程ID仍然有效)。