std::
set::emplace_hint
公众成员函数 <set>
template <class... Args>
iterator emplace_hint (const_iterator position, Args&&... args);
构造插入元素并加提示
在集合中插入一个新元素(如果唯一),并在插入位置上提供提示。
这个新元素是使用args作为其构造的参数构造的。
只有当容器中没有与被放置的元素相等的其他元素时,插入才会发生(set容器中的元素是唯一的)。
position中的值用作插入点上的提示。尽管如此,
元素仍将按照其内部比较对象描述的顺序插入到其相应的位置,
但函数使用此提示开始搜索插入点,当实际插入点位于该位置或接近该位置时,该过程将大大加快。
通过调用allocator_traits::construct并传递args来构造元素。
☲ 参数
-
position
-
元素可插入位置的提示。
如果位置指向插入元素后面的元素(如果是最后一个元素,则指向最后一个元素),则该函数优化其插入时间.
注意,这并不强制将新元素插入到set容器中的那个位置(set中的元素总是遵循特定的顺序)。
Const_iterator是一个成员类型,定义为指向元素的双向迭代器类型。
-
args
-
用于构造新元素的参数。
☉ 返回值
如果函数成功插入元素(因为集合中已经没有等效的元素),则函数返回一个迭代器到新插入的元素。
否则,它返回一个指向容器中等效元素的迭代器。
成员类型迭代器是指向元素的双向迭代器类型。
☣ 示例
// 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
✥ 复杂度
一般来说,容器大小为对数。
如果元素的插入点是 position,则为平摊常数。
☣ 迭代器的有效性
不变.
⇄ 数据竞争
容器被修改。
并发地访问现有元素是安全的,但迭代容器中的范围则不安全。
☂ 异常安全性
强保证:如果抛出异常,容器中不会有任何变化。
如果allocator_traits::construct不支持相应的参数,或者指定了无效的位置,它会导致未定义行为。
🍄 另请参阅
set::emplace |
构造插入元素(公众成员函数) |
set::insert |
插入元素(公众成员函数) |
set::erase |
删除元素(公众成员函数) |