std :: map和std :: set不会返回带有提示的bool

时间:2014-03-20 17:52:38

标签: c++ c++11 stl stdmap stdset

如何有效地实现这个显然不存在的功能(为什么?):

std::pair<iterator,bool> std::set::insert (const_iterator hint, const value_type& val);

我想有效地插入一个值(带提示),同时有一个bool告诉我它是否已被插入(这是必不可少的)。

为什么这种功能不存在。我想不出有效地做到这一点的可能性?

非常感谢!

1 个答案:

答案 0 :(得分:1)

通常假设你有一个提示迭代器,你通过findequal_rangelower_boundupper_bound获取它,或者插入一个排序序列,所以如果您需要知道,可以检查*hint(或可能*prev(hint))是否等同于val您自己:

iterator hint = s.lower_bound(val);
// (hint == s.end() || !(*hint < val)) && (hint == s.begin() || *prev(hint) < val)
if (hint != s.end() && !(val < *hint))
    ; // equivalent
else
    s.insert(hint, val); // guaranteed to insert

请注意,如果无法插入(即*hint等同于val),则插入带提示 保证在O(1)中执行,因此你应该在调用insert之前检查插入是否成功。

类似地,对于从upper_bound派生的提示迭代器:

iterator hint = s.upper_bound(val);
// (hint == s.end() || val < *hint) && (hint == s.begin() || !(val < *prev(hint)))
if (hint != s.begin() && !(*prev(hint) < val))
    ; // val is equivalent to *prev(hint)
else
    s.insert(hint, val); // guaranteed to insert