public member function
<set>

std::set::emplace

template <class... Args>  pair<iterator,bool> emplace (Args&&... args);
构造并插入元素
set 中插入一个新元素,前提是该元素是唯一的。这个新元素使用 args 作为其构造参数原地构造。

只有当容器中不存在与待插入元素等价的元素时,才会进行插入(set 容器中的元素是唯一的)。

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

在内部,set 容器会根据其 比较对象 指定的准则,将所有元素保持排序状态。元素总是会插入到其在排序后应有的位置。

元素通过调用 allocator_traits::construct 并转发 args 来原地构造。

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

参数

args
转发给构造新元素的参数。

返回值

如果函数成功插入了元素(因为 set 中原本不存在等价的元素),函数将返回一个 pair,其中包含指向新插入元素的迭代器和一个布尔值true.

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

成员类型iterator是一个指向元素的 双向迭代器 类型。
pair是声明在<utility>中的类模板(参见pair)。

示例

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
// set::emplace
#include <iostream>
#include <set>
#include <string>

int main ()
{
  std::set<std::string> myset;

  myset.emplace("foo");
  myset.emplace("bar");
  auto ret = myset.emplace("foo");

  if (!ret.second) std::cout << "foo already exists in myset\n";

  return 0;
}
输出
foo already exists in myset


复杂度

对容器 size 取对数。

迭代器有效性

没有变化。

数据竞争

容器已被修改。
并发访问现有元素是安全的,但遍历容器范围不是。

异常安全

强保证:如果抛出异常,容器没有发生变化。
如果不支持带有适当参数的 allocator_traits::construct,将导致 *未定义行为*。

另见