2.插入元素
前面看到multiset的insert操作,返回插入的位置(迭代器),set不允许插入比较结果相同的元素,调用insert就有可能失败,
所以set 的insert函数的返回值,和multiset的不一样:
std::pair <iterator, bool> insert(const value_type& elem);
set如果插入新元素失败,那么返回中的“second”值为false.
回忆vector,list等容器,它们的insert都还有一个“pos”的入参,用于只是新元素插在哪个位置上,前面使用的sets的insert函数没有这个指示。
这很好理解,因为一个元素要插在sets(复数,表示set和multiset,下同)中的哪个位置,这是调用者控制不了的。不过,sets却又拥有一个带pos版本的insert函数:
iterator insert(const_iterator hint_pos
, const value_type& value);
//这里列的是C++ 11的版本,老版本中hint_pos是iterator类型
当小朋友们在按身高排队时,新插入的同学肯定会大概估计一下自己的身高应该在那个同学前后,哪怕是5岁的小朋友也不会笨到从第1个比起……
hint_pos正是起“位置提示”作用的,sets会以该迭代器作为判断起点,只要不是瞎提示,通常它的性能会较大提高,带“hint”版的insert函数的另一个作用就是让sets拥有和其他容器接口一致的insert操作。
sets带“hiint”版的insert,返回一个迭代器,要么是成功插入后的位置,要么是阻止本次插入的位置,要靠这个返回结果判断是否真正插入,有点难。