emplace_back()是c++11的新特性。和push_back()的区别在于push_back()方法要调用构造函数和复制构造函数,这也就代表着要先构造一个临时对象,然后把临时的copy构造函数拷贝或者移动到容器最后面。
而emplace_back()在实现时,则是直接在容器的尾部创建这个元素,省去了拷贝或移动元素的过程。
vector<pair<int, int>> ret; ret.push_back(1,1)//会报错,因为没有构造一个临时对象 ret.push_back(pair(1,1))//不会报错,因为构成了一个pair对象 ret.emplace_back(1,1)//不会报错,因为直接在容器的尾部创建对象
class A { public: A(int i){ str = to_string(i); cout << "构造函数" <<++i<< endl; } ~A(){} A(const A& a): str(a.str){ cout << "拷贝构造" <<++j<< endl; } public: string str; }; int main(){ vector<A> vec; vec.reserve(10);//开辟capacity for(int i=0;i<10;i++){ vec.push_back(i); //调用了10次构造函数和10次拷贝构造函数, // vec.emplace_back(i); //调用了10次构造函数,一次拷贝构造函数都没有调用过 } }
C++11 新特性—EMPLACE操作
新标准引入了:
- emplace_front : 在容器的头部创建元素,返回void;对应push_front。
- emplace:在迭代器指向的元素之前创建一个元素,并返回新添加元素的迭代器;对应insert 。
- emplace_back : 在容器的尾部创建元素,返回void;对应push_back。
这些操作构造而不是拷贝元素到容器中,即直接调用构造函数,不会调用拷贝构造函数,省去了拷贝所需的时间和资源,更加高效。
emplace操作与push、insert的区别:
emplace成员函数利用传入的参数在容器管理的内存中直接构造元素;push与insert成员函数则是将传入的元素类型对象拷贝到容器中,或创建一个局部临时对象,并将其压入容器中。
注意:emplace函数的参数根据元素类型而变化,参数必须与元素类型的构造函数相匹配。
此外,可以利用emplace函数将char型字符转换成string类型字符串压入容器中:
vector<string>v; char ch = 'a'; v.emplace_back(1, ch);//利用string(int n,char c)构造n个c的字符串
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· 阿里巴巴 QwQ-32B真的超越了 DeepSeek R-1吗?
· 【译】Visual Studio 中新的强大生产力特性
· 【设计模式】告别冗长if-else语句:使用策略模式优化代码结构
· AI与.NET技术实操系列(六):基于图像分类模型对图像进行分类