为什么需要将对插入地图?

时间:2014-01-20 13:10:52

标签: c++ map stl std-pair

虽然我不喜欢它,但发现宣布pair<X,Y>对象或打电话给make_pair是不方便的,以便致电map::insert。为什么insert不使用两个参数来分别指定Key和Value。

虽然我知道这是为了与其他STL容器兼容,但展示value_type。但是find方法需要key_type来破坏这种兼容性断言。 map同时拥有key_typemapped_type,为什么map无法拥有:

iterator insert(const key_type&, const mapped_type&);

是的,有insert超载的重载。但这两个论点insert本来可以很好地混合。

我看到的一个优点是:减少了调用堆栈的使用。

修改: 刚刚发现insert是仅采用value_type 方法,即pair<X,Y>。许多其他方法,例如finderaseatcountequal_rangelower_boundupper_bound和{{1} } operator[]

1 个答案:

答案 0 :(得分:6)

所有标准库容器都定义了value_type成员类型,其接口通常按照value_typeinsertpush_backpush_front进行操作。新界面emplace添加了一种构建value_type对象的方法,如下所示:

value_type(std::forward<Args>(args)...)

基本上,没有为卫星数据关联容器(即地图)提供特殊接口,这些容器知道value_type的特殊结构(其定义,并非完全众所周知)为{{ 1}}),但pair<const key_type, mapped_type>find以及erase除外,它们带有operator[]个参数。

这可能是对标准的监督,或者也许从未被视为问题,因为您始终可以使用key_typemake_pairmake_tuple或{{1 ,创建地图值类型。

forward_as_tuple和仅限移动的映射类型存在一个问题,该类型已浮出水面且属于this recent proposal。)