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 }; 并留给实现。
正如其他用户在 cmets 中指出的那样,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。