为什么set / map emplace_hint不会返回布尔值

时间:2015-10-06 12:27:23

标签: c++ c++11 stl

根据cppreferencestd::setstd::map emplace个函数都会返回std::pair<iterator,bool>,其bool值表示插入实际发生了。

但是,如果插入没有发生,emplace_hint会向插入的元素或集合或映射中的现有元素返回iterator。这里没有bool值。

这些类似功能的界面是否存在这种差异的原因?

更新

仅当未提供提示时,函数insert才会返回bool值。这与emplaceemplace_hint的行为一致。那么问题是:当给出提示时,有没有理由不返回bool

我只能认为可能存在一些性能原因,因为用户通常在lower_bound / upper_bound操作后提供提示,因此确保插入将会发生。

2 个答案:

答案 0 :(得分:5)

emplace_hint可能与提示的insertemplace保持一致initially proposed是一对重载,镜像insert,但暗示过载在LWG 763之后重新命名,尽管Josuttis想改为rename the non-hinted version

关联容器的暗示insert接受迭代器和值并返回迭代器,以便与通用代码中顺序容器上的常规insert兼容。如Josuttis的书中所提到的那样。 std::inserter

利用了这种兼容性

答案 1 :(得分:2)

确定是否发生换位的最简单方法是将地图的size()存储在变量中并测试,emplace_hint()之后该大小是否增加了:

auto oldsz = myMap.size();
myMap.emplace_hint(it, args...);
if(myMap.size() > oldsz) {
    // emplace was accepted
} else {
    // the emplace was rejected, as it would have overwritten an element
}

如果在已有键的情况下新值将覆盖旧值,则insert_or_assign()也可以使用相同的代码。