std::map和std::unordered_map主要提供如下几种添加操作:
- try_emplace () (C++17)
- emplace ()
- insert()
- [] =
下面给出一段测试代码,观察对象在添加到std::map中时,构造对象过程中会有什么区别:
#include
VC++2017的运行结果:
--------------------------------
--------------------------------//(1)
Kid(string _name, int _age)3
Kid(const Kid&)4
People(string _name, int _age)3
--------------------------------//(2)
Kid(string _name, int _age)5
Kid(Kid&&)6
People(string _name, int _age)4
--------------------------------//(3)
Kid(string _name, int _age)7
People(string _name, int _age)5
Kid(const Kid&)8
People(const People&)6
--------------------------------//(4)
People(string _name, int _age)7
Kid(string _name, int _age)9
Kid(Kid&&)10
People(People&&)8
--------------------------------//(5)
People(string _name, int _age)9
Kid(string _name, int _age)11
Kid(Kid&&)12
People(People&&)10
Kid(Kid&&)13
People(People&&)11
--------------------------------//(6)
Kid(string _name, int _age)14
People(string _name, int _age)12
--------------------------------//(7)
People(string _name, int _age)13
Kid(string _name, int _age)15
Kid(Kid&&)16
People(People&&)14
Kid(Kid&&)17
People(People&&)15
--------------------------------//(8)
People(string _name, int _age)16
Kid(string _name, int _age)18
Kid(Kid&&)19
People()17
operator=(const People&)4
--------------------------------
从以上运行结果中可以看到,只讲对象构造效率的话,效率从高到低依次为:
(6) > (2) > (4) > (5) (7) > (1) > (3) > (8)
其中(6)只调用了2次构造函数,(2)调用了2次构造函数和1次转移构造函数,(4)调用了2次构造函数和2次转移构造函数,(5)(7)调用了2次构造函数和4次转移构造函数,(1)调用了2次构造函数和1次拷贝构造函数,(3)调用了2次构造函数和2次拷贝构造函数,(8)调用了3次构造函数、1次拷贝构造函数和1次赋值函数。但对象构造效率高低还不能决定添加操作的效率,即添加操作的效率排名不一定退以上排名一样。
下面对以上几种方式分别进行代码测试,代码如下:
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
运行结果:
--------------------------------//map
--------------------------------//(1)
934167100: 934.167
--------------------------------//(2)
892646600: 892.647
--------------------------------//(3)
919973300: 919.973
--------------------------------//(4)
917704500: 917.705
--------------------------------//(5)
935676700: 935.677
--------------------------------//(6)
946283500: 946.284
--------------------------------//(8)
939161000: 939.161
--------------------------------//unordered_map
--------------------------------//(1)
269299400: 269.299
--------------------------------//(2)
278339800: 278.34
--------------------------------//(3)
269483600: 269.484
--------------------------------//(4)
273019500: 273.02
--------------------------------//(5)
274466600: 274.467
--------------------------------//(6)
267864800: 267.865
--------------------------------//(8)
273746400: 273.746
从数值上看,这几种方式的效率相差并不大,而且每次执行的结果的排名都不完全相同。这应该是编译器做了大量的编译优化,所以执行效率都还是不错的。