public member function
<unordered_set>

std::unordered_set::emplace

template <class... Args>pair <iterator,bool> emplace ( Args&&... args );
构造并插入元素
如果其值在unordered_set中是唯一的,则插入新元素。新元素使用args作为元素构造函数的参数就地构造。

仅当容器中没有与要插入的元素值等价的元素时,插入才会发生(unordered_set中的元素具有唯一的值)。

如果成功插入,则容器的size将有效增加一。

存在一个类似的成员函数insert,它会复制或移动现有对象到容器中。

参数

args
传递给要插入的新元素的构造函数的参数。

返回值

如果函数成功插入元素(因为不存在其他具有相同值的元素),则函数返回一个pair,其中包含指向新插入元素的迭代器和一个值为true.

否则,它返回一个指向容器中现有等价元素的迭代器和一个值为false.

成员类型iteratorforward iterator类型,指向一个元素。
unordered_set 中的所有迭代器都具有对元素的 const 访问权限:元素可以被插入或删除,但不能在容器中被修改。

pair是声明在<utility>中的类模板(参见pair)。

新元素的存储使用allocator_traits<allocator_type>::construct()分配,这在失败时可能会抛出异常(对于默认的 allocatorbad_alloc如果分配请求不成功,则抛出)。

示例

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
// 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


复杂度

平均情况:常量。
最坏情况:容器大小的线性。
可能会触发 rehash(未包含)。

迭代器有效性

在大多数情况下,插入后容器中的所有迭代器都保持有效。唯一的例外是当容器的增长强制重新哈希时。在这种情况下,容器中的所有迭代器都将失效。

如果插入操作后新容器的size超过了其容量阈值(计算方法为容器的bucket_count乘以其max_load_factor),则强制进行rehash。

unordered_set 容器中元素的引用在所有情况下都保持有效,即使在 rehash 之后也是如此。

另见