微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

在C ++中的自定义unordered_map容器上实现高效插入

如何解决在C ++中的自定义unordered_map容器上实现高效插入

我正在创建一个自定义的C ++ STL容器库,我有一个问题涉及到代码大小和执行时间的有效插入(尽可能多地复制)。

我想编写一个可以从其他类似插入的函数调用的插入函数(_insert_unique)(同样适用于查找/擦除),并且保留其语义

例如:

    std::pair<iterator,bool> insert(const value_type &val) {
        return _insert_unique(val);
    }

    std::pair<iterator,bool> insert(value_type &&val) {
        return _insert_unique(std::move(val));
    }

    template <class... Args>
    std::pair<iterator,bool> emplace(Args&&... args) {
       return _insert_unique(std::forward<Args>(args)...);
    }

通过保留语义,我的意思是,该函数应避免在参数为value_type &&时创建副本,或者如果键中不存在键,则避免在emplace()中构造键(I知道C ++ 11 emplace()版本需要使用“ forward_as_tuple”和“ piecewise_construct”来解决此问题,并且此后引入了新函数try_emplace()。)

所以我的问题是,如果不为每个类似插入的函数编写重复的代码,是否可以实现我想要的功能

解决方法

如果我理解正确,那么您正在尝试保留参数的值类别 有两种方法可以做到这一点:

  • 超载:
void myFunc(const Object& obj) { handleObject(obj); }
void myFunc(Object&& obj) { handleObject(std::move(obj)); }
  • 转发参考
template <typename T>
void myFunc(T&& obj) { handleObject(std::forward<T>(obj)); }

在第二种情况下,&&用于保留对象值类别的转发参考。 因此,如果您不想重复功能,则只需使用示例中的转发引用即可:

    template <class... Args>
    std::pair<iterator,bool> emplace(Args&&... args) {
       return _insert_unique(std::forward<Args>(args)...);
    }

希望我没有误会你的问题

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。