Как я могу использовать boost::thread::id как ключ к unordered_map?
Согласно документации, boost::thread::id
может считаться уникальным для каждого запущенного потока и может использоваться в контейнерах, таких как std::set
а также std::map
(поскольку <
оператор переопределен для thread::id
).
Моя проблема в том, что я хотел бы использовать thread::id
как ключ к boost::unordered_map
Однако для этого требуется, чтобы ключ был "хэшируемым" (т. е. поддерживает хеширование в size_t
). Поскольку все детали реализации для thread::id скрыты, я не думаю, что могу что-либо использовать.
Итак, мой вопрос - возможно ли использовать thread::id в качестве ключа к unordered_map?
4 ответа
Вы можете использовать потоковую способность:
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);
};
Сколько у вас потоков? Если у вас не более нескольких сотен, вряд лиunordered_map
с тяжелым хешем (а хеш тяжелый особенно на основе std::stringstream
) будет быстрее std::map
, Не подделывай это std::map
имеет сложность журнала с довольно небольшой константой.
А если у вас сотни потоков, то, вероятно, проблема в вашем приложении.
Зачем вам нужно продолжить со строками? Ты можешь использовать
size_t operator()(const boost::thread::id& id)
{
using boost::hash_value;
return hash_value(id);
}
Документация говорит, что это может быть записано в поток. Запишите это std::ostringstream
и хэш str()
результат. Хотя выходной формат не указан, он уникален для данного идентификатора и согласован для данного запуска вашей программы (при условии, что идентификатор потока в любом случае останется действительным).