public member function
<set>

std::set::emplace_hint

template <class... Args>  iterator emplace_hint (const_iterator position, Args&&... args);
帶提示構建並插入元素
set 中插入新元素(如果唯一),並提供插入位置的提示。此新元素將使用args 作為其建構函式的引數進行就地構造。

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

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

position 中的值用作插入點的提示。然而,元素仍將根據其內部 比較物件 的描述插入到其對應的位置,但此提示用於函式開始搜尋插入點,當實際插入點是position 或接近它時,可以大大加快過程。

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

引數

position
元素可插入位置的提示。
如果position 指向要插入的元素的後繼元素(或者如果它是最後一個元素,則指向 end),則函式會最佳化其插入時間。
請注意,這不會強制將新元素插入到 set 容器中的特定位置(set 中的元素始終遵循特定順序)。
const_iterator是一個成員型別,定義為指向元素的 雙向迭代器型別。
args
轉發給構造新元素的引數。

返回值

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

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

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

示例

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

int main ()
{
  std::set<std::string> myset;
  auto it = myset.cbegin();

  myset.emplace_hint (it,"alpha");
  it = myset.emplace_hint (myset.cend(),"omega");
  it = myset.emplace_hint (it,"epsilon");
  it = myset.emplace_hint (it,"beta");

  std::cout << "myset contains:";
  for (const std::string& x: myset)
    std::cout << ' ' << x;
  std::cout << '\n';

  return 0;
}
輸出
myset contains: alpha beta epsilon omega


複雜度

通常,時間複雜度為容器 size 的對數。
如果元素的插入點是 position,則為攤銷常數複雜度。

迭代器有效性

沒有變化。

資料競爭

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

異常安全

強保證:如果丟擲異常,容器沒有發生變化。
如果不支援帶有元素構造適當引數的 allocator_traits::construct,或者指定了無效的position,則會導致未定義行為

另見