首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >c++ std::map `emplace`和`emplace_back`重载

c++ std::map `emplace`和`emplace_back`重载
EN

Stack Overflow用户
提问于 2021-03-25 21:07:32
回答 1查看 104关注 0票数 0

我的问题如下:

我有两个函数:

代码语言:javascript
复制
using my_map_t = std::map<int, double>;
using my_map_iterator_t = my_map_t::iterator;
my_map_t my_map;

...

void func1(int a, double b) {
    ...
    my_map.emplace(a, b);
    ...
}

void func2(int a, double b, my_map_iterator_t hint) {
    ...
    my_map.emplace_hint(hint, a, b)
    ...
}

我希望避免代码重复,并尽可能快。我找到的一个可能的解决方案是

代码语言:javascript
复制
template <bool has_hint>
func(int a, double b, my_map_iterator_t hint=my_map.end() /*unused if has_hint=false*/) {
    ...
    if constexpr(has_hint) 
        my_map.emplace_hint(hint, a, b);
    else
        my_map.emplace(a, b);
    ...
}

但不幸的是,我在目标机器上没有c++17编译器。

我在考虑使用提示的默认参数,这样emplace_hint将具有与emplace完全相同的效果。然而,我假设map被实现为(RB)树,因此所需的迭代器将每隔一次计算一次(可能是“中间迭代器”)。

你能给我推荐一条优雅的出路吗?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2021-03-25 21:26:34

你可以用一种通用的方法来分解:

代码语言:javascript
复制
template <typename F>
void func_impl(int a, double b, F emplacer)
{
// ...
    emplacer(my_map, a, b);
// ...
}

void func1(int a, double b) {
    func_impl(a, b, [](auto& my_map, int a, double b) { my_map.emplace(a, b); });
}

void func2(int a, double b, my_map_iterator_t hint) {
    func_impl(a, b, [&hint](auto& my_map, int a, double b) { my_map.emplace_hint(a, b, hint); });
}
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/66800168

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档