std::map::try_emplace()
看起来非常方便和有效,但它只适用于C++ 17.是否可以在C++ 11中重新实现它?
templatepair try_emplace(const key_type& k, Args&&... args);
Kerrek SB.. 6
对于有序地图,您可以通过以下方式接近行为lower_bound
:
templatestd::pair try_emplace_m(M& m, const typename M::key_type& k, Args&&... args) { auto it = m.lower_bound(k); if (it == m.end() || m.key_comp()(k, it->first)) { return {m.emplace_hint( it, std::piecewise_construct, std::forward_as_tuple(k), std::forward_as_tuple(std::forward (args)...)), true}; } return {it, false}; }
对于无序地图,您无法使用lower_bound
.您可以将其替换find
为测试,并使用key_eq()
,以获得功能版本,但在插入的情况下将执行重复查找.Sp纯粹在算法复杂性方面说,这个新成员函数在无序情况下更加重要,用户目前无法仅使用公共API实现.但增加的便利性同样适用于这两种情况.
对于有序地图,您可以通过以下方式接近行为lower_bound
:
templatestd::pair try_emplace_m(M& m, const typename M::key_type& k, Args&&... args) { auto it = m.lower_bound(k); if (it == m.end() || m.key_comp()(k, it->first)) { return {m.emplace_hint( it, std::piecewise_construct, std::forward_as_tuple(k), std::forward_as_tuple(std::forward (args)...)), true}; } return {it, false}; }
对于无序地图,您无法使用lower_bound
.您可以将其替换find
为测试,并使用key_eq()
,以获得功能版本,但在插入的情况下将执行重复查找.Sp纯粹在算法复杂性方面说,这个新成员函数在无序情况下更加重要,用户目前无法仅使用公共API实现.但增加的便利性同样适用于这两种情况.