为什么在STL中set的insert函数中存在position参数

时间:2016-04-10 08:46:58

标签: c++ stl set

设置始终按排序顺序插入元素,因此不应该告诉要插入的位置。

iterator insert (iterator position, const value_type& val);

那么为什么会有一个位置参数,它有用吗?

2 个答案:

答案 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);