public member function
<set>

std::multiset::emplace

template <class... Args>  iterator emplace (Args&&... args);
构造并插入元素
multiset 中插入一个新元素。使用 args 作为其构造函数的参数,在新元素的原位构造该元素。

这会使容器的 size 增加一。

在内部,multiset 容器会根据其 比较对象 指定的标准,始终将所有元素保持排序状态。元素始终按照此排序关系插入到其相应的位置。

通过调用转发 argsallocator_traits::construct 在原位构造该元素。

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

等价元素之间的相对顺序没有保证。
等效元素的相对顺序得以保留,新插入的元素将跟在其容器中已存在的等效元素之后。

参数

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

返回值

指向新插入元素的迭代器。

成员类型iterator是指向元素的双向迭代器类型。

示例

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

int main ()
{
  std::multiset<std::string> mymultiset;

  mymultiset.emplace("foo");
  mymultiset.emplace("bar");
  mymultiset.emplace("foo");

  std::cout << "mymultiset contains:";
  for (const std::string& x: mymultiset)
    std::cout << ' ' << x;
  std::cout << '\n';

  return 0;
}
输出
mymultiset contains: bar foo foo


复杂度

相对于容器 size 的对数时间复杂度。

迭代器有效性

没有变化。

数据竞争

容器被修改。
并发访问现有元素是安全的,但迭代容器中的范围不是。

异常安全

强保证:如果抛出异常,容器没有发生变化。
如果 allocator_traits::construct 不支持相应的参数,则会导致未定义行为

另见