typedef map<KeyType, ValType> KVMap;
KVMap kvmap;
kvmap.insert( KVMap::value_type( key, val ) );
kvmap.insert( make_pair( key, val ) );
Run Code Online (Sandbox Code Playgroud)
要插入STL地图的上述哪个选项总是更快?为什么?
注意:我很清楚这insert()比[]=用于向地图添加(不更新)键值对更快.请假设我的查询是关于添加,而不是更新.因此我限制它insert().
ice*_*ime 20
有可能第一个将是'epsilon-faster',因为这个(从标准中的23.3.1):
typedef pair<const Key, T> value_type;
[...]
pair<iterator, bool> insert(const value_type& x);
Run Code Online (Sandbox Code Playgroud)
在第一个版本中,您可以直接构造期望的相应类型 std::map<K,V>::insert
在第二个版本中,std::pair涉及使用模板构造函数的转换.事实上,std::make_pair将最有可能推断出其模板参数KeyType和ValType信息,并返回一个std::pair<KeyType, ValType>.
这与参数类型不匹配std::map<K,V>::insert,即std::pair<const KeyType, ValType>(const首先是- 限定的差异).该std::pair转换构造函数将被用来建立一个std::pair<const K, V>从std::pair<K, V>.
公平地说,我不相信你甚至可以衡量差异(我甚至不确定流行的编译器实际上会为这些编译生成不同的代码).
tem*_*def 12
这里实际上是要做出一个参数value_type上make_pair.这是因为,出于各种神秘的原因,make_pair通过值接受其参数.另一方面,value_typefor的别名std::pair<const Key, value>将使用const引用传递的参数调用其构造函数.make_pair相对于参考传递,传递价值可能会导致效率下降,理论上这可能会对您的计划产生显着影响.
需要担心的另一个问题make_pair是,make_pair通常会创建一对类型std::pair<Key, Value>而不是std::pair<const Key, Value>内部需要的类型map.这意味着可能会有另一个不必要的副本,这次是pair为了使转换正常工作.
简而言之,使用make_pair可能会导致两个完全不必要的键和值的副本,而使用value_type构造函数则没有.
这只是一个补充。
insert( make_pair(...) )
由于其他回答者提到的原因,名义上调用复制构造函数 4 次。
insert( value_type(...) )
调用复制构造函数 2 次。
operator[]
在典型的实现中,调用默认构造函数一次并调用复制构造函数两次。operator[]默认构造函数在for
内部调用insert( value_type( ..., mapped_type() ) )。复制构造函数被调用一次以复制 的insert()argument( pair) ,并调用一次以复制构造映射的内部节点。
因此,如果您使用insertwith make_pair,则不能说它insert总是比operator[]添加更快。或许,这要视情况而定。如您所知,鉴于上述情况,emplace提出了新标准。
| 归档时间: |
|
| 查看次数: |
20276 次 |
| 最近记录: |