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,则会导致未定义行为

另见