根据cppreference,std::set
和std::map
emplace
个函数都会返回std::pair<iterator,bool>
,其bool
值表示插入实际发生了。
但是,如果插入没有发生,emplace_hint
会向插入的元素或集合或映射中的现有元素返回iterator
。这里没有bool
值。
这些类似功能的界面是否存在这种差异的原因?
更新
仅当未提供提示时,函数insert
才会返回bool
值。这与emplace
和emplace_hint
的行为一致。那么问题是:当给出提示时,有没有理由不返回bool
?
我只能认为可能存在一些性能原因,因为用户通常在lower_bound
/ upper_bound
操作后提供提示,因此确保插入将会发生。
答案 0 :(得分:5)
emplace_hint
可能与提示的insert
:emplace
保持一致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()
也可以使用相同的代码。