【发布时间】:2015-10-06 12:27:22
【问题描述】:
根据cppreference,std::set 和std::mapemplace 函数都返回一个std::pair<iterator,bool>,并带有一个bool 值来说明插入是否实际发生。
但是,emplace_hint 会返回一个 iterator 给插入的元素,或者如果插入没有发生,则返回给 set 或 map 中的现有元素。这里没有bool 值。
这些类似功能的界面有什么不同的原因吗?
更新
函数insert 仅在未提供提示时返回bool 值。这与emplace 和emplace_hint 的行为一致。那么问题来了:在给出提示时是否有任何理由不返回bool?
我只能认为可能有一些性能原因,因为用户通常在lower_bound/upper_bound操作后提供提示,所以插入肯定会发生。
【问题讨论】:
-
如果为插入提供了提示,无论是insert还是emplace_hint都只返回迭代器(状态没有bool),所以这个行为是相当一致的
-
确实如此。我会更新我的问题。
-
提示函数可能会简化效率回报。
emplace_hint旨在用于您知道在哪里执行插入的情况,如果使用正确,它实际上是O(1)操作,而不是O(log2(n))。当您花费O(log2(n))时,构建和返回该对的增量成本很小(相对而言),但如果您有意使用为您提供O(1)的超优化方法,您可能不希望这样(诚然很小)高架。它会返回一个iterator,因此您可以检查内容(或者只是比较size前后的内容)。 -
也就是说,效率只是一个猜测。在 C++11 之前,根据实现和编译器,返回
std::pair<iterator, bool>之类的对象的增量成本可能比仅返回iterator高得多。在 C++11 中无关紧要(其中命名的局部变量可以通过直接构造返回到它们的调用者中,而不是复制构造和破坏),但emplace_hint可能遵循早于 C 的早期提示函数的引导++11.