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 不支援相應的引數,則會導致未定義行為

另見