首页 > 编程知识 正文

C 优化之使用emplace,班级优化师使用的角色

时间:2023-05-05 09:43:58 阅读:180044 作者:4703

C开发经常使用STL的各种容器,如vector、map和set。 这些集装箱对我们的开发非常方便。 在使用这些容器的过程中,有很多插入操作,例如vector的push_back、映射的插入和集的插入。 这些插入操作涉及两次结构,首先是对象的初始化结构,然后在插入时复制一次,触发复制结构。 但是,在很多情况下,我们不需要两次结构造成的效率浪费,只要在插入时能够直接结构,一次结构就足够了。

C 11标准中已经可以直接使用这样的语法了。 那就是emplace。 vector可以使用两个函数: emplace、emplace_back。 emplace与insert类似,emplace_back与push_back类似。 使用示例代码可以更清楚地看到差异。

//Book结构,用于存储书籍信息的structs book { sbook (: bookname ),price(0) 0,STD :3360 cout ' default construct 3360 ' book name int price_ ) :bookname ) bookname_,price(price_ ) STD3360:cous (; sbook(sbookRHS ) :bookname(RHS.bookname ),price ) RHS.price ) STD 3360: cout ' copy construct 3360 ' booknamme (bok ) }booloperator(constsbookRHS ) const ) returnbooknameRHS.bookname; } STD :字符串bookname; int price; (; 测试向量书册; //事先分配。 否则,在矢量整体容量不足情况下,存储books.reserve(100 ); STD :3360 cout ' test push _ back : ' endl; books.push_back(sbook ) ) c从入门到放弃),1 ); std:cout endl; STD :3360 cout ' testemplace _ back : ' endl; books.emplace_back (《水浒传》,2 ); std:cout endl; STD : cout ' testemplace _ back default : ' endl; books.emplace_back (; auto book=books.back (; book.bookName='红楼梦'; book.price=5; std:cout endl; STD :成本' testemplace : ' endl; autoit=books.emplace(books.end ); it-bookName='西游记'; it-price=3; std:cout endl; STD : cout ' outputallbooks : ' endl; for_each(books.begin )、books.end ([ ] ) constsbookbook )-void ) STD : cout book.bookname endl;

}); std::cout << endl;​​​​// 测试setset<SBook> 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)) 这个语句首先执行了构造函数,接着执行拷贝构造复制到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

版权声明:该文观点仅代表作者本人。处理文章:请发送邮件至 三1五14八八95#扣扣.com 举报,一经查实,本站将立刻删除。