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 之後也是如此。

另見