C++emplace_back

更新时间:2023-05-20 20:33:09 阅读: 评论:0

C++emplace_back
概述
在C++11中,在引⼊右值的升级后,调⽤push_back变的更为⾼效,原本需要调⽤构造函数构造这个临时对象,然后调⽤拷贝构造函数将这个临时对象放⼊容器中。在C++11升级后,只需要调⽤构造函数,然后调⽤移动拷贝函数。
就好⽐,现在⼿⾥有个⾯包,要把这个放到⾯包袋⼦⾥,原来的逻辑是,⽣产⼀个⾯包,然后在⾯包袋⼦⾥根据⽣产的⾯包再复制⼀个⼀摸⼀样的,在引⼊右值引⽤升级之后,现在的push_back的逻辑是,⽣产⼀个⾯包,然后把这个⾯包挪到袋⼦⾥(也就是移动拷贝)⽽不是再照着这个⾯包复制⼀个新的。
在此基础上,可以更快些吗?答案是可以的,在C++11中,可以调⽤emplace_back,emplace_back直接通过参数构造对象⾄容器中,不需要拷贝或者移动。如果继续使⽤⾯包的例⼦(这⾥可能不太恰当了),就好⽐⾯包⽣产出来就直接在袋⼦⾥了,没有拷贝,没有移动。如此会更加⾼效。
这是标准库vector的emplace_back⽅法的介绍以及⼀些例⼦:
使⽤
//以下代表功能⼀样,但效率不⼀样
vector
emplace <--> inrt
emplace_back<--> p ush_back
t
emplcace <--> inrt
map
emplace <--> inrt
简单的使⽤,以vector的emplace_back为例
struct Student {
string name;
int age;
Student(string&& n, int a)
:name(std::move(n)), age(a)
{
cout << "构造" << endl;
}
Student(const Student& s)
: name(std::move(s.name)), age(s.age)
{
理想之国cout << "拷贝构造" << endl;;
}
Student(Student&& s)
:name(std::move(s.name)), age(s.age)
{
cout << "移动构造" << endl;
补血益气的食物有哪些}
Student& operator=(const Student& s);lol小悠
};
int main()
{
vector<Student> class_one;
vector<Student> class_two;
cout << "emplace_back:" << endl;
place_back("xiaohong", 24);
cout << "push_back:" << endl;
class_two.push_back(Student("xiaoming", 23));
}
执⾏结果
原理
push_back():先向容器尾部添加⼀个右值元素(临时对象),然后调⽤构造函数构造出这个临时对象,最后调⽤移动构造函数将这个临时对象放⼊容器中并释放这个临时对象。
注:最后调⽤的不是拷贝构造函数,⽽是移动构造函数。因为需要释放临时对象,所以通过std::move进⾏移动构造,可以避免不必要的拷贝操作
emplace_back():在容器尾部添加⼀个元素,调⽤构造函数原地构造,不需要触发拷贝构造和移动构造。因此⽐push_back()更加⾼效。
扩展
struct Student {
string name;
int age;
Student(string&& n, int a)
:name(std::move(n)), age(a)
{
cout << "构造" << endl;
}
Student(const Student& s)
: name(std::move(s.name)), age(s.age)    {
cout << "拷贝构造" << endl;;
}
Student(Student&& s)
:name(std::move(s.name)), age(s.age)    {
cout << "移动构造" << endl;
}
Student& operator=(const Student& s); };
int main()
{
vector<Student> class;工资计提
for(int i=1;i<100;i++) {
}
}
结果
春深似海构造
1--1构造
拷贝构造
2--2构造
日圆拷贝构造
拷贝构造
3--4构造
4--4构造
拷贝构造
拷贝构造枢密院
拷贝构造
拷贝构造
5--8构造后盾作文
6--8构造
7--8构造
8--8构造
拷贝构造
拷贝构造
拷贝构造拷贝构造拷贝构造9--16构造10--16构造11--16构造12--16构造13--16构造14--16构造15--16构造16--16构造拷贝构造拷贝构造拷贝构造拷贝构造拷贝构造拷贝构造拷贝构造拷贝构造拷贝构造拷贝构造拷贝构造拷贝构造拷贝构造拷贝构造拷贝构造拷贝构造17--32构造18--32构造19--32构造20--32构造21--32构造22--32构造23--32构造24--32构造25--32构造26--32构造27--32构造28--32构造29--32构造30--32构造31--32构造32--32构造拷贝构造拷贝构造拷贝构造拷贝构造拷贝构造拷贝构造拷贝构造拷贝构造拷贝构造拷贝构造拷贝构造拷贝构造拷贝构造拷贝构造拷贝构造拷贝构造拷贝构造拷贝构造拷贝构造
拷贝构造拷贝构造拷贝构造拷贝构造拷贝构造拷贝构造拷贝构造拷贝构造拷贝构造33--64构造34--64构造35--64构造36--64构造37--64构造38--64构造39--64构造40--64构造41--64构造42--64构造43--64构造44--64构造45--64构造46--64构造47--64构造48--64构造49--64构造50--64构造51--64构造52--64构造53--64构造54--64构造55--64构造56--64构造57--64构造58--64构造59--64构造60--64构造61--64构造62--64构造63--64构造64--64构造拷贝构造拷贝构造拷贝构造拷贝构造拷贝构造拷贝构造拷贝构造拷贝构造拷贝构造拷贝构造拷贝构造拷贝构造拷贝构造拷贝构造拷贝构造拷贝构造拷贝构造拷贝构造拷贝构造拷贝构造

本文发布于:2023-05-20 20:33:09,感谢您对本站的认可!

本文链接:https://www.wtabcd.cn/fanwen/fan/82/711472.html

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。

标签:构造   拷贝   容器   食物   放到   照着   功能   理想
相关文章
留言与评论(共有 0 条评论)
   
验证码:
推荐文章
排行榜
Copyright ©2019-2022 Comsenz Inc.Powered by © 专利检索| 网站地图