C++ STL中set的insert函数为什么有位置参数

C++ STL中set的insert函数为什么有位置参数,c++,stl,set,C++,Stl,Set,设置“始终按排序顺序插入元素”,这样就没有必要告诉要插入的位置 iterator insert (iterator position, const value_type& val); 那么为什么会有一个位置参数,它有用吗?该参数将用作插入位置的提示,以提高指向正确位置的复杂性 提示-迭代器,指向从C++11开始插入新元素之前的位置 复杂性 如果插入发生在该位置,则摊销常数 在提示之后,容器大小为对数 否则 一种可能的情况是修改set的元素假设不会改变排序顺序。std::set::ite

设置“始终按排序顺序插入元素”,这样就没有必要告诉要插入的位置

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

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

该参数将用作插入位置的提示,以提高指向正确位置的复杂性

提示-迭代器,指向从C++11开始插入新元素之前的位置

复杂性 如果插入发生在该位置,则摊销常数 在提示之后,容器大小为对数 否则


一种可能的情况是修改set的元素假设不会改变排序顺序。std::set::iterator是常量迭代器,这意味着您不能直接通过std::set::iterator修改元素。您可以1定位元素,2制作副本并修改副本,3从集合中删除元素,4将副本作为新值插入。在第四步,您可以将第三步得到的迭代器作为提示传递给std::set::insert。

它被用作插入新元素的提示,并且它使std::set接口与其他容器兼容,例如std::vector:insert,这样您就可以使用具有类似于T::insert操作的assums类型

您还可以首先使用优化插入,如果两个返回的迭代器相等,则表示未找到任何元素,迭代器指向可以插入此元素的位置:

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