上一篇文章介绍了std::map在普通operator[]赋值的流程std::map的使用_DongDongBaJiaYou的博客-CSDN博客
这一篇继续研究下std::map的集中插入方式的效率问题:
std::map<char,Student> mymap;
std::map<char,Student>::iterator it;
mymap['a'] = "string_a"; //与Student("string_a")相同,这里包含了4步:
//1.调用Student(const char* name)
//2.调用Student()
//3.调用Student& operator=(const Student& other)
//4.调用~Student()
mymap.insert(std::pair<char, Student>('b', "string_b"));//这里包含了3步:
//1.调用Student(const char* name)
//2.调用Student (const Student& other)
//3.调用~Student()
mymap.insert(std::make_pair<char, Student>('d', "string_d"));//这里包含了5步:
//1.调用Student(const char* name)
//2.调用Student (const Student& other)
//3.调用Student (const Student& other)
//4.调用~Student()
//5.调用~Student()
mymap.insert(std::make_pair('c', "string_c"));//这里包含了1步:
//1.调用Student(const char* name)
mymap.emplace('e', "string_e"); //这里包含了1步:
//1.调用Student(const char* name)
可以看到,使用emplace是优的!不管在写法还是效率上都是最优的!
再看下QMap的两种方式:
QMap<char,Student> mymap;
QMap<char,Student>::iterator it;
mymap['a'] = Student("string_a"); //与Student("string_a")相同,这里包含了6步:
//1.调用Student(const char* name)
//2.调用Student()
//3.调用调用Student (const Student& other)
//4.调用~Student()
//5.调用Student& operator=(const Student& other)
//6.调用~Student()
mymap.insert('b', "string_b");//与Student("string_a")相同,这里包含了3步:
//1.调用Student(const char* name)
//2.调用Student (const Student& other)
//3.调用~Student()
可以看到,使用insert是最优的!不管在写法还是效率上都是最优的!
结论:在C++11加持下,std::map的emplace看来是最好的方法了!