public member function
<map>

std::map::emplace

template <class... Args>  pair<iterator,bool> emplace (Args&&... args);
構造並插入元素
如果其鍵是唯一的,則在 map 中插入新元素。使用 args 作為構造一個value_type(它是 pair 型別物件)的引數,新元素將被就地構造。

僅當容器中沒有其他元素具有與要 emplaced 的鍵等效的鍵時,才會進行插入(map 容器中的鍵是唯一的)。

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

map 容器在內部會根據其 比較物件 指定的標準,始終按鍵將所有元素保持排序狀態。元素始終被插入到其排序後的相應位置。

透過呼叫 allocator_traits::construct 並轉發 args 來就地構造元素。

存在一個類似的成員函式 insert,它將現有物件複製或移動到容器中。

引數

args
用於構造插入元素的 mapped type 的新物件的引數。
轉發給用於構造新元素(型別為 pair<const key_type, mapped_type>)的引數。
可以是以下之一:
- 兩個引數:一個用於 key,另一個用於 mapped value
- 一個型別為 pair 的引數,其第一個成員是 key 的值,第二個成員是 mapped value 的值。
- 以 piecewise_construct 作為第一個引數,再加上兩個額外的引數,這些引數是用於分別轉發給 key valuemapped value 的構造引數的 tuple
有關更多資訊,請參閱 pair::pair

返回值

如果函式成功插入元素(因為 map 中不存在等效元素),則函式返回一個 pair,其第一個成員是指向新插入元素的迭代器,第二個成員是true.

否則,它返回一個指向容器中等效元素的迭代器,以及一個值為false.

成員型別iterator是指向元素的 雙向迭代器 型別。
pair是宣告在<utility>中的類模板(參見pair)。

示例

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

int main ()
{
  std::map<char,int> mymap;

  mymap.emplace('x',100);
  mymap.emplace('y',200);
  mymap.emplace('z',100);

  std::cout << "mymap contains:";
  for (auto& x: mymap)
    std::cout << " [" << x.first << ':' << x.second << ']';
  std::cout << '\n';

  return 0;
}
輸出
mymap contains: [x:100] [y:200] [z:100]


複雜度

對容器 size 的對數複雜度。

迭代器有效性

沒有變化。

資料競爭

容器被修改。
併發訪問現有元素是安全的,但迭代容器中的範圍不是。

異常安全

強保證:如果丟擲異常,容器沒有發生變化。
如果 allocator_traits::construct 不支援適當的引數,則會導致 未定義行為

另見