当前位置:  开发笔记 > 编程语言 > 正文

在C++ 11中从C++ 17重新实现std :: map :: try_emplace()?

如何解决《在C++11中从C++17重新实现std::map::try_emplace()?》经验,为你挑选了1个好方法。

std::map::try_emplace()看起来非常方便和有效,但它只适用于C++ 17.是否可以在C++ 11中重新实现它?

template 
pair try_emplace(const key_type& k, Args&&... args);

Kerrek SB.. 6

对于有序地图,您可以通过以下方式接近行为lower_bound:

template 
std::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实现.但增加的便利性同样适用于这两种情况.



1> Kerrek SB..:

对于有序地图,您可以通过以下方式接近行为lower_bound:

template 
std::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实现.但增加的便利性同样适用于这两种情况.

推荐阅读
手机用户2502852037
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有