unordered_set
имеет конструктор, который берет ряд элементов для их первоначального добавления:
template< class InputIt >
unordered_set( InputIt first, InputIt last,
size_type bucket_count = /*implementation-defined*/,
const Hash& hash = Hash(),
const key_equal& equal = key_equal(),
const Allocator& alloc = Allocator() );
Так что вы можете просто сделать collection = std::unordered_set{ p, p + count };
и оставить его до реализации.
Как отметил другой пользователь в комментариях, существует также перегрузка для insert
, которая принимает диапазон:
template< class InputIt >
void insert( InputIt first, InputIt last );
Так что, как и при вызове конструктора, вы можете сделать, collection.insert(p, p + count);
Нет гарантии, что эти перегрузки будут более эффективными, поскольку сложность линейна как в среднем по обеим перегрузкам, так и для простого вставления элементов один за другим.
На самом деле, если мы посмотрим, как insert
реализован в MSVC, это очень просто
template<class _Iter>
void insert(_Iter _First, _Iter _Last)
{ // insert [_First, _Last) at front, then put in place
_DEBUG_RANGE(_First, _Last);
for (; _First != _Last; ++_First)
emplace(*_First);
}
, поэтому никакой оптимизации для этого случая.
Я думаю, лучший способ сделать это - позвонить reserve
, если вызнать количество элементов, которые вы собираетесь добавить, и, если есть много коллизий (которых не будет для целых чисел), возможно, измените bucket_count
.