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 不支持相应的参数,则会导致未定义行为

另见