Как реализовать boost::unordered_map с ключом websocketpp::connection_hdl?

Для моего приложения гораздо удобнее и логичнее держать карту websocketpp::connection_hdl в качестве ключей на карте, но я обнаружил, что это может быть потенциально опасно, поскольку они являются weak_ptr.

Однако было заявлено, что boost::unordered_map не может сломаться, если срок действия ключа weak_ptr истек.

Это правда? Если да, то как можно сконструировать его так, чтобы он содержал connection_hdl в качестве ключей, а также мог быть вставлен, стерт и найден/подсчитан? Кроме того, что необходимо, чтобы иметь возможность перебирать их, например, с помощью for?

В настоящее время это выходит за рамки моего набора навыков, поэтому я не уверен, на что смотрю.


person Community    schedule 19.04.2014    source источник


Ответы (1)


boost::unordered_map может быть медленным при итерации, поэтому я бы посоветовал вам хранить все websocketpp::connection_hdl в std::vector. Для карты в качестве ключей можно использовать указатели: boost::unordered_map<websocketpp::connection_hdl*, X>

person Philipp H.    schedule 20.04.2014
comment
да. Или, если вам подходит время O(log(n)) на итерацию и поиск, используйте std::map. - person Philipp H.; 20.04.2014
comment
Все stl-контейнеры — это то, что вы туда положили, и останется там. Вы должны удалить просроченные соединения из каждого контейнера самостоятельно. - person Philipp H.; 20.04.2014
comment
Еще раз спасибо! Этот ответ и ваши комментарии противоречат этому? stackoverflow.com/a/23156251/1382306 Все это выходит за рамки моих навыков, и мне нужно сделать это правильно. Огромное спасибо заранее! - person ; 20.04.2014
comment
Указатель всегда будет указывать на какой-то адрес, порядок или хэш всегда определены. Просто позаботьтесь об удалении записей просроченных соединений. - person Philipp H.; 22.04.2014