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,將導致 *未定義行為*。

另見