c++ - std::map 和 std::set 不返回带提示的 bool

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

我怎样才能有效地实现这个显然不存在的功能(为什么?):

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

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

为什么没有这样的功能。我无法想出有效地做到这一点的可能性?

非常感谢!

最佳答案

通常假设如果你有一个提示迭代器,你通过 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

请注意,如果插入失败,insert-with-hint 保证在 O(1) 内执行(即 *hint 等同于 val ),因此您应该在调用 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

关于c++ - std::map 和 std::set 不返回带提示的 bool,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22541268/

相关文章:

c++ - 为什么 emplace/_front/_back 不返回引用?

c++ - 在 C++ 中创建一个列表来保存对象

c++ - QT - 未知的调试器类型 "No engine"

c++ - 使用 mmap 映射文件中的不同段

visual-studio - 参数包扩展失败

c++ - 方法和内部类同名(错误 : . ..与先前的声明冲突)

c++ - 如何根据另一个 vector 对一个 vector 进行排序?

c++ - 迭代时从 vector 中删除项目?

c++ - 如何初始化指向 nullptr 的指针 union ?

c++ - 以编程方式设置标题栏和边框颜色