C++ STL vector添加元素之push_back()和emplace_back()的区别

本文介绍了C++中vector容器的push_back()和emplace_back()两个成员函数,它们都在容器尾部添加元素。push_back()会先创建元素再拷贝或移动到容器中,而emplace_back()直接在容器尾部构造元素,避免了额外的拷贝或移动操作,因此emplace_back()通常具有更高的效率。通过实例代码展示了两者的底层实现差异,并通过测试类的构造函数调用来进一步说明。
摘要由CSDN通过智能技术生成

push_back()

该成员函数的功能是在 vector 容器尾部添加一个元素。
eg:

#include <iostream>
#include <vector>
using namespace std;
int main()
{
    vector<int> values;
    values.push_back(1); //向 values 容器尾部添加一个首元素
    values.push_back(2); //在元素1后面添加2
    for (int i = 0; i < values.size(); i++) {
        cout << values[i] << " ";
    }
    return 0;
}

输出结果:

1 2

emplace_back()

C++ 11 新增加,其功能和 push_back() 相同,都是在 vector 容器的尾部添加一个元素。
eg:

#include <iostream>
#include <vector>
using namespace std;
int main()
{
    vector<int> values;
    values.emplace_back(1);
    values.emplace_back(2);
    for (int i = 0; i < values.size(); i++) {
        cout << values[i] << " ";
    }
    return 0;
}

输出结果:

1 2

以上 2 段代码,只是用 emplace_back() 替换了 push_back(),实现的功能是一样的,但其底层实现机制却是不同的。

emplace_back()和push_back()的不同之处

emplace_back() 和 push_back() 底层实现的机制不同。push_back() 向容器尾部添加元素时,首先会创建这个元素,然后再将这个元素拷贝或者移动到容器中(如果是拷贝的话,事后会自行销毁先前创建的这个元素);而 emplace_back() 在实现时,则是直接在容器尾部创建这个元素,省去了拷贝或移动元素的过程。
为了更加清晰明了党的认识到二者的不同,直接上代码:

#include <vector> 
#include <iostream> 
using namespace std;
class testDemo
{
public:
    testDemo(int num):num(num){
        std::cout << "调用构造函数" << endl;
    }
    testDemo(const testDemo& other) :num(other.num) {
        std::cout << "调用拷贝构造函数" << endl;
    }
    testDemo(testDemo&& other) :num(other.num) {
        std::cout << "调用移动构造函数" << endl;
    }
private:
    int num;
};
int main()
{
    cout << "emplace_back:" << endl;
    std::vector<testDemo> demo1;
    demo1.emplace_back(2);  
    cout << "push_back:" << endl;
    std::vector<testDemo> demo2;
    demo2.push_back(2);
}

输出结果:

emplace_back:
调用构造函数
push_back:
调用构造函数
调用移动构造函数

将 testDemo 类中的移动构造函数注释掉,再运行程序结果变为:

emplace_back:
调用构造函数
push_back:
调用构造函数
调用拷贝构造函数

所以,push_back() 在底层实现时,会优先选择调用移动构造函数,如果没有才会调用拷贝构造函数。
完成同样的操作,push_back() 的底层实现过程比 emplace_back() 更繁琐,换句话说,emplace_back() 的执行效率比 push_back() 高。

  • 2
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值