【发布时间】:2017-12-23 21:35:13
【问题描述】:
由于 set / map 的emplace_hint 方法仅返回一个迭代器,因此确定是否实际添加了项不如使用emplace 或insert 时方便。现在我只是在之前/之后获取容器大小并比较它们:
::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_hint与lower_bound的结果结合起来。因此,该信息在行动之前是可用的。否则emplace_hint不能保证比普通的emplace更好。 -
lower_bound技巧是用于 POD 容器的好方法。对于类的容器,构造函数总是可以有一个额外的参数bool &,由构造函数设置;所以当emplace_hint返回时,检查bool中的内容会告诉您是否构造了一个对象。 -
@StoryTeller 在我的情况下,插入的值大多是单调递减的,但有相当数量的值仍会位于中间的某个位置。此外,这些值有些繁重,所以我决定保持代码简单,始终提供
begin作为提示(与emplace相比,它确实提高了性能,尽管它并不总是最优的)。 -
@SamVarshavchik 不是安放在
set中总是构造一个项目吗?此外,这种方法仍然需要定义一个额外的bool类型的局部变量。 -
不是,正如你所指出的,如果设置的项目已经存在。