std::
unordered_set::emplace
公众成员函数 <unordered_set>
template <class... Args>
pair<iterator,bool> emplace (Args&&... args);
构造并插入元素
在
unordered_set中插入一个新元素,如果它的值是唯一的。这个新元素是使用
args作为元素构造函数的参数构造的。
只有当容器中没有与被放置的元素相等的其他元素时,插入才会发生(unordered_set容器中的元素是唯一的)。
存在一个类似的成员函数,
insert,它复制或移动现有的对象到容器中。
☲ 参数
-
args
-
传递给要插入的新元素的构造函数的参数。
☉ 返回值
如果函数成功插入元素(因为集合中已经没有等效的元素),则函数返回一个
pair迭代器到新插入的元素,并返回
true值。
否则,它返回一个指向容器中等效元素的迭代器,并返回一个
false值。
unordered_set容器中的所有迭代器都具有对元素的
const访问权限:元素可以插入或移除,但不能在容器中修改。
成员类型迭代器是指向元素的前向迭代器类型。
Pair是在
<utility>中声明的类模板(参见
Pair)。
使用
allocator_traits<allocator_type>::construct()分配新元素的存储,
失败时可能抛出异常(对于默认分配器,如果分配请求不成功则抛出
bad_alloc)。
☣ 示例
// unordered_set::emplace
#include <iostream>
#include <string>
#include <unordered_set>
int main ()
{
std::unordered_set<std::string> myset;
myset.emplace ("potatoes");
myset.emplace ("milk");
myset.emplace ("flour");
std::cout << "myset contains:";
for (const std::string& x: myset) std::cout << " " << x;
std::cout << std::endl;
return 0;
} |
输出:
myset contains: potatoes flour milk
✥ 复杂度
平均情况下:常数。
最坏情况:容器大小呈线性。
可能会触发重新hash(不包括)。
☣ 迭代器的有效性
在大多数情况下,容器中的所有迭代器在插入之后仍然有效。唯一的例外是容器的增长迫使重新hash。
在这种情况下,容器中的所有迭代器都失效。
如果插入操作后的新容器大小超过其容量阈值(计算方法为容器的bucket_count乘以其max_load_factor),
则强制进行rehash。
对unordered_set容器中的元素的引用在所有情况下仍然有效,即使在重新散列之后也是如此。
🍄 另请参阅
unordered_set::find |
获取元素的迭代器(公众成员函数) |
unordered_set::insert |
插入元素(公众成员函数) |