【问题标题】:Figure out whether an item has been added or not when using emplace_hint在使用 emplace_hint 时判断是否添加了一个项目
【发布时间】:2017-12-23 21:35:13
【问题描述】:

由于 set / map 的emplace_hint 方法仅返回一个迭代器,因此确定是否实际添加了项不如使用emplaceinsert 时方便。现在我只是在之前/之后获取容器大小并比较它们:

::std::map<int, int> items{};
const auto initial_items_count{items.size()};
const auto it_item{items.emplace_hint(items.begin(), 0, 5)};
if(items.size() != initial_items_count)
{
    // perform additional actions...
}

它可以被包装成一个帮助器返回对,但也许有一个现有的更简单的方法?

【问题讨论】:

  • 我想这个想法是通常将emplace_hintlower_bound 的结果结合起来。因此,该信息在行动之前是可用的。否则 emplace_hint 不能保证比普通的 emplace 更好。
  • lower_bound 技巧是用于 POD 容器的好方法。对于类的容器,构造函数总是可以有一个额外的参数bool &amp;,由构造函数设置;所以当emplace_hint 返回时,检查bool 中的内容会告诉您是否构造了一个对象。
  • @StoryTeller 在我的情况下,插入的值大多是单调递减的,但有相当数量的值仍会位于中间的某个位置。此外,这些值有些繁重,所以我决定保持代码简单,始终提供 begin 作为提示(与 emplace 相比,它确实提高了性能,尽管它并不总是最优的)。
  • @SamVarshavchik 不是安放在set 中总是构造一个项目吗?此外,这种方法仍然需要定义一个额外的 bool 类型的局部变量。
  • 不是,正如你所指出的,如果设置的项目已经存在。

标签: c++ c++11 emplace


【解决方案1】:

鉴于 map::size 是 O(1)(根据标准),我相信这种方法(尤其是使用模仿 map::emplace 回报的助手)是合理的。

【讨论】:

  • 你看,添加这么小的独立包装器与没有它的麻烦差不多。这将有助于摆脱一个额外的临时变量,但作为交换,我将获得一个额外的包含和一些额外的依赖管理麻烦。这实际上不是什么大问题,但是我注意到我已经多次编写了类似的代码,并且怀疑我可能正在做一些没有效率的事情。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2021-12-18
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-03-17
相关资源
最近更新 更多