设置始终按排序顺序插入元素,因此不应该告诉要插入的位置。
iterator insert (iterator position, const value_type& val);
那么为什么会有一个位置参数,它有用吗?
答案 0 :(得分:3)
该参数将用作std::set::insert
的插入positioin的提示,以便在指向正确位置时提高复杂性。
提示 - 将插入新元素的位置的迭代器(自C ++ 11起)
复杂性
如果插入发生在该位置,则摊销常数 在提示之后,以容器的大小为对数 否则。
可能的情况之一是修改set
的元素(假设不会更改排序顺序)。 std::set::iterator
是const迭代器,它意味着您无法直接通过std::set::iterator
修改元素。您可以(1)找到元素,(2)制作副本并修改副本,(3)从set
中删除元素,(4)将副本作为新值插入。在第4步,您可以将第3步的迭代器传递给std::set::insert
作为提示。
答案 1 :(得分:0)
它用作提示应该插入新元素的提示,它也使std::set
接口与其他容器兼容,即。 std::vector:insert
,这样您就可以使用std::inserter类似于T::insert
类型的操作。
您也可以先使用std::set::equal_range优化插入,如果两个返回的迭代器相等,则表示没有找到任何元素,迭代器指向可以插入此元素的位置:
std::set<int> s = {0,1,2,3,5,6,7};
auto r = s.equal_range(4);
if ( r.first == r.second )
s.insert(r.first, 4);