public member function
<set>

std::multiset::emplace_hint

template <class... Args>  iterator emplace_hint (const_iterator position, Args&&... args);
帶提示構建並插入元素
在 multiset 中插入一個新元素,並給出插入的位置提示。該新元素會就地構造,使用 args 作為其構造的引數。

這會使容器的大小有效增加一。

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

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

等價元素之間的相對順序沒有保證。
等效元素的相對順序得以保留,新插入的元素將跟在其容器中已存在的等效元素之後。

引數

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

返回值

指向新插入元素的迭代器。

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

示例

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

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

  mymultiset.emplace_hint (it,"apple");
  it = mymultiset.emplace_hint (mymultiset.cend(),"orange");
  it = mymultiset.emplace_hint (it,"melon");
  mymultiset.emplace_hint (it,"melon");

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

  return 0;
}
輸出
mymultiset contains: apple melon melon orange


複雜度

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

迭代器有效性

沒有變化。

資料競爭

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

異常安全

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

另見