【问题标题】:Hint when inserting/emplacing new element into unordered_map/unordered_set将新元素插入/放置到 unordered_map/unordered_set 时的提示
【发布时间】:2019-05-10 19:58:20
【问题描述】:

如果我在std::unordered_map 中插入一个新元素(键不存在),我可以使用emplace_hint 提高性能吗? 提示应该有什么价值?

通常我知道键值(整数类型)大于映射中的所有键。那我应该使用cend 作为提示吗?

【问题讨论】:

  • 那么我应该使用cend 作为提示吗? – 嗯……那东西是无序的

标签: c++ c++11 unordered-map unordered-set


【解决方案1】:

我做了一些测试,从我看到的情况来看,std::unordered_map 似乎完全忽略了这个提示。我找不到任何似乎可以提供任何优势的价值传递给它。

该标准明确给出了无序集合的实现,以忽略传递给emplace_hint 的提示,我认为大多数(如果不是全部)通常都会这样做。规范并没有真正说明您是否应该将迭代器传递给正在插入的值(如果有的话)还是传递给过去的值(就像使用有序关联集合一样)。鉴于它是基于散列的,接近正确插入点的迭代器可能是无用的。因此,为了让它有做任何好事的希望,它可能需要成为实际插入点的迭代器(例如,如果您尝试插入重复项,则它与您插入的键具有相同的键)。

总结

我怀疑你可以传递的任何价值都可以提供任何显着优势(在测试中,我还没有找到这样的价值)。

【讨论】:

    【解决方案2】:

    emplace_hint 在使用无序容器时并不是真正需要的。与std::map 不同的是,std::map 有保证的订单并使用end 作为提示会给你恒定的位置,无序版本已经有恒定的位置。

    如果我们查看Table 70 — Unordered associative container requirements (in addition to container),我们有

    期望: value_­type 是 Cpp17EmplaceConstructible 到 Xargs

    效果:相当于a.emplace( std::forward<​Args>(​args)...)。返回值是一个迭代器,指向与新插入元素等效的键的元素。 const_­iterator p 是指向搜索应该从哪里开始的提示。允许实现忽略提示。

    你可以看到你甚至不能保证提供一个提示会做任何事情。

    线

    const_­iteratorp 是指向搜索应该从哪里开始的提示

    让我相信迭代器需要位于要放置元素的存储桶的开头,因此 end/cend 不是您想要使用的。

    【讨论】:

      猜你喜欢
      • 2015-09-10
      • 1970-01-01
      • 1970-01-01
      • 2011-12-01
      • 2020-11-15
      • 2013-03-11
      • 2012-06-20
      • 2021-05-20
      • 1970-01-01
      相关资源
      最近更新 更多