必知的技术知识:emplace

简介: 必知的技术知识:emplace

在C++开发过程中,我们经常会用STL的各种容器,比如vector,map,set等,这些容器极大的方便了我们的开发。在使用这些容器的过程中,我们会大量用到的操作就是插入操作,比如vector的push_back,map的insert,set的insert。这些插入操作会涉及到两次构造,首先是对象的初始化构造,接着在插入的时候会复制一次,会触发拷贝构造。但是很多时候我们并不需要两次构造带来效率的浪费,如果可以在插入的时候直接构造,就只需要构造一次就够了。


C++11标准已经有这样的语法可以直接使用了,那就是emplace。vector有两个函数可以使用:emplace,emplace_back。emplace类似insert,emplace_back类似pushback。通过示例代码可以更清晰的了解到他们的区别。


// Book结构,保存书本信息


struct SBook


{


SBook() : bookName(""), price(0)


{


std::cout [ "default construct: " [ bookName [ std::endl;


}


SBook(std::string bookName, int price) : bookName(bookName), price(price_)


{


std::cout [ "construct: " [ bookName [ std::endl;


};


SBook(SBook& rhs) : bookName(rhs.bookName), price(rhs.price)


{


std::cout [ "copy construct: " [ bookName [ std::endl;


}


~SBook()


{


std::cout [ "deconstruct: " [ bookName [ std::endl;


}


bool operator <(const SBook& rhs) const


{


return bookName < rhs.bookName;


}


std::string bookName;


int price;


};


// 测试vector


vector books;


// 预先分配,否则整个vector在容量不够的情况下重新分配内存


books.reserve(100);


std::cout [ "test push_back:" [ endl;


books.push_back(SBook("C++从入门到放弃", 1));


std::cout [ endl;


std::cout [ "test emplace_back:" [ endl;


books.emplace_back("水浒传", 2);


std::cout [ endl;


std::cout [ "test emplace_back default:" [ endl;


books.emplace_back();


auto& book = books.back();


book.bookName = "红楼梦";


book.price = 5;


std::cout [ endl;


std::cout [ "test emplace:" [ endl;


auto it = books.emplace(books.end());


it->bookName = "西游记";


it->price = 3;


std::cout [ endl;


std::cout [ "output all books: " [ endl;


for_each(books.begin(), books.end(), 【】(const SBook& book)->void


{


std::cout [ book.bookName [ endl;


});


std::cout [ endl;?


?


// 测试set


set bookSet;?


?


std::cout [ "test bookSet insert:" [ endl;


bookSet.insert(SBook("十万个为什么", 1));


std::cout [ endl;


?


?std::cout[ "test bookSet emplace:" [ endl;


bookSet.emplace("新华字典", 2);


std::cout [ endl;


?


?std::cout[ "output bookset: " [ endl;


for_each(bookSet.begin(), bookSet.end(), 【】(const SBook&book)->void


{


std::cout [ book.bookName [ endl;


});


std::cout [ endl;


运行结果如下


从结果可以看出,books.push_back(SBook("C++从入门到放弃",1)//代码效果参考:http://www.lyjsj.net.cn/wz/art_24165.html

) 这个语句首先执行了构造函数,接着执行拷贝构造复制到vector,最后销毁临时对象。

而emplace_back和emplace都只调用一次构造函数。两相对比,效率上的提高不言而喻。


set的分析结果也类似,bookSet.insert(SBook("十万个为什么",1)) 这个语句执行了两次构造,一次析构。而 bookSet.emplace("新华字典", 2) 语句只执行了一次构造。


通过上面的分析,在开发过程中,如果使用emplace可以达到效果,就应该尽量使用emplace。尤其像push_back,insert这种大量使用的语句,替换使用可以从整体上提高程序的运行效率。


总结相关语法如下


vector


emplace insert


emplace_back? ?push_back


set


emplcace insert


map


emplace insert

相关文章
|
5月前
|
编译器 C++ 容器
【C++练级之路】【Lv.7】【STL】vector类的模拟实现
【C++练级之路】【Lv.7】【STL】vector类的模拟实现
|
5月前
|
存储 搜索推荐 C++
【C++修行之道】STL(初识pair、vector)
【C++修行之道】STL(初识pair、vector)
|
5月前
|
C++ 容器
基于STL的演讲比赛流程管理系统
基于STL的演讲比赛流程管理系统
|
5月前
|
存储 C++ 容器
C++初阶(十三)vector
C++初阶(十三)vector
46 0
|
11月前
|
存储 前端开发 C++
【C++从0到王者】第十七站:手把手教你写一个stack和queue及deque的底层原理
【C++从0到王者】第十七站:手把手教你写一个stack和queue及deque的底层原理
70 0
|
容器
如何熟练使用vector?
如何熟练使用vector?
42 0
|
4月前
|
存储 C++
C++初阶学习第九弹——探索STL奥秘(四)——vector的深层挖掘和模拟实现
C++初阶学习第九弹——探索STL奥秘(四)——vector的深层挖掘和模拟实现
38 8
|
4月前
|
存储 编译器 Linux
C++初阶学习第十弹——探索STL奥秘(五)——深入讲解vector的迭代器失效问题
C++初阶学习第十弹——探索STL奥秘(五)——深入讲解vector的迭代器失效问题
45 7
|
4月前
|
存储 C++ 容器
C++初阶学习第八弹——探索STL奥秘(三)——深入刨析vector的使用
C++初阶学习第八弹——探索STL奥秘(三)——深入刨析vector的使用
36 7
|
11月前
|
存储 算法 Linux
【C++杂货铺】探索vector的底层实现
【C++杂货铺】探索vector的底层实现
31 0