虽然我不喜欢它,但发现声明一对< X,Y>是不方便的.对象,或调用make_pair,以调用map :: insert.为什么insert不使用两个参数来分别指定Key和Value.
虽然我理解它是为了与其他STL容器兼容,但它展示了value_type.但是find方法采用key_type来打破这种兼容性断言. map既有key_type又有mapped_type,所以为什么cant map有:
iterator insert(const key_type&,const mapped_type&);
是的,插入迭代器有重载.但是这个两个参数的插入可能混合得很好.
我看到的一个优点是:减少了调用堆栈的使用.
编辑:
刚刚发现insert是唯一采用value_type的方法,即pair< X,Y>.许多其他方法,如find,erase,at,count,equal_range,lower_bound,upper_bound和operator []采用key_type.
解决方法
所有标准库容器都定义了一个value_type成员类型,它们的接口通常按照value_type:insert,push_back,push_front进行操作.新接口emplace添加了一种构造value_type对象的方法,如下所示:
value_type(std::forward<Args>(args)...)
基本上,没有为卫星数据关联容器(即地图)提供特殊的接口,它们知道value_type的特殊结构(已定义,并非完全众所周知,bepair< const key_type,mapped_type>),查找和擦除以及带有key_type参数的operator []除外.
它可能是对标准的疏忽,或者它从未被认为是一个问题,因为你总是可以使用make_pair,make_tuple或forward_as_tuple或emplace来创建地图值类型.
(插入和仅移动映射类型有一个问题,它已浮出水面并且是this recent proposal的主题.)