虽然我不喜欢它,但发现宣布pair<X,Y>
对象或打电话给make_pair
是不方便的,以便致电map::insert
。为什么insert
不使用两个参数来分别指定Key和Value。
虽然我知道这是为了与其他STL容器兼容,但展示value_type
。但是find
方法需要key_type
来破坏这种兼容性断言。 map
同时拥有key_type
和mapped_type
,为什么map
无法拥有:
iterator insert(const key_type&, const mapped_type&);
是的,有insert
超载的重载。但这两个论点insert
本来可以很好地混合。
我看到的一个优点是:减少了调用堆栈的使用。
修改:
刚刚发现insert
是仅采用value_type
的 方法,即pair<X,Y>
。许多其他方法,例如find
,erase
,at
,count
,equal_range
,lower_bound
,upper_bound
和{{1} } operator[]
。
答案 0 :(得分:6)
所有标准库容器都定义了value_type
成员类型,其接口通常按照value_type
:insert
,push_back
,push_front
进行操作。新界面emplace
添加了一种构建value_type
对象的方法,如下所示:
value_type(std::forward<Args>(args)...)
基本上,没有为卫星数据关联容器(即地图)提供特殊接口,这些容器知道value_type
的特殊结构(其定义,并非完全众所周知)为{{ 1}}),但pair<const key_type, mapped_type>
和find
以及erase
除外,它们带有operator[]
个参数。
这可能是对标准的监督,或者也许从未被视为问题,因为您始终可以使用key_type
,make_pair
或make_tuple
或{{1 ,创建地图值类型。
(forward_as_tuple
和仅限移动的映射类型存在一个问题,该类型已浮出水面且属于this recent proposal。)