公有成員函式
<map>

std::map::emplace_hint

template <class... Args>  iterator emplace_hint (const_iterator position, Args&&... args);
帶提示構建並插入元素
如果鍵是唯一的,則在 map 中插入一個新元素,並給出插入*位置*的提示。此新元素使用*args*作為構造一個value_type(它是*pair*型別的物件)的引數來就地構造。

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

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

*position*中的值用作插入點的提示。該元素仍將插入到其對應的位置,遵循其內部*comparison object*描述的順序,但該提示用於函式開始搜尋插入點,當實際插入點是*position*或接近它時,可以大大加快該過程。

透過呼叫*args*轉發的*allocator_traits::construct*在原地構造元素。

引數

position
元素可插入位置的提示。
如果*position*指向將要插入元素的元素(或指向*end*,如果它將是最後一個),則該函式會最佳化其插入時間。
請注意,這不會強制將新元素放置在 map 容器內的該位置(map 中的元素始終遵循特定順序)。
const_iterator是一個成員型別,定義為指向元素的 雙向迭代器型別。
args
用於構造插入元素的新*mapped type*物件的引數。
轉發給新元素(型別為pair<const key_type, mapped_type>)構造的引數。
這可以是以下之一:
- 兩個引數:一個用於*key*,一個用於*mapped value*。
- 一個*pair*型別的單個引數,其第一個成員為*key*值,第二個成員為*mapped value*值。
- 第一個引數為*piecewise_construct*,另外兩個引數為*tuples*,分別轉發給*key value*和*mapped value*的建構函式引數。
有關更多資訊,請參閱*pair::pair*。

返回值

如果函式成功插入元素(因為 map 中已不存在等效元素),則函式返回一個指向新插入元素的迭代器。

否則,它返回一個指向容器中等效元素的迭代器。

成員型別iterator是一個指向元素的*雙向迭代器*型別。

示例

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

int main ()
{
  std::map<char,int> mymap;
  auto it = mymap.end();

  it = mymap.emplace_hint(it,'b',10);
  mymap.emplace_hint(it,'a',12);
  mymap.emplace_hint(mymap.end(),'c',14);

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

  return 0;
}
輸出
mymap contains: [a:12] [b:10] [c:14]


複雜度

通常,與容器*size*的對數成比例。
如果元素的插入點是 position,則為攤銷常數複雜度。

迭代器有效性

沒有變化。

資料競爭

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

異常安全

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

另見