vector push_back()和emplace_back()用法总结

本文详细介绍了C++中`push_back()`和`emplace_back()`函数的使用,通过实例展示了当传入左值和右值引用时,它们调用的不同构造函数。总结了`push_back()`在参数为左值时会进行拷贝构造,而右值则调用转移构造。`emplace_back()`则直接在容器内部构造对象,避免了额外的拷贝和移动操作,提高了效率。
摘要由CSDN通过智能技术生成
  1. push_back()用法总结
#include<iostream>
#include<vector>
using namespace std;
typedef struct testEmplace 
{
    testEmplace()
    {
        std::cout << "create testEmplace" << std::endl;
    }

    testEmplace(int a)
    {
        std::cout << "create testEmplace with param" << std::endl;
    }

    testEmplace(const testEmplace& src)
    {
        std::cout << "copy testEmplace" << std::endl;
    }

    testEmplace(testEmplace&& src)
    {
        std::cout << "move testEmplace" << std::endl;
    }
    
    ~testEmplace()
    {
        std::cout << "destroy testEmplace" << std::endl;
    }

    testEmplace& operator = (const testEmplace& rht)
    {
        std::cout << " operator =() testEmplace" << std::endl;
    }
}testEmplace;

int main(int argc, char* argv[])
{
    std::vector<testEmplace> test;
    test.reserve(10); //指定初始容量,防止后续加入元素操作引发容器自动增长

    testEmplace a;//构造
    test.push_back(a);//拷贝构造
    std::cout << "==============" << std::endl;

    testEmplace b;//构造
    test.push_back(std::move(b));//移动构造
    std::cout << "==============" << std::endl; 

    test.push_back(1);//构造临时对象+移动构造
    std::cout << "==============" << std::endl;

	test.push_back(testEmplace(12));//构造临时对象+移动构造
    std::cout << "==============" << std::endl;
    return 0;
}

输出结果:

create testEmplace
copy testEmplace
==============
create testEmplace
move testEmplace
==============
create testEmplace with param
move testEmplace
destroy testEmplace
==============
create testEmplace with param
move testEmplace
destroy testEmplace
==============
destroy testEmplace
destroy testEmplace
destroy testEmplace
destroy testEmplace
destroy testEmplace
destroy testEmplace

通过运行上面的代码可知:当push_back()的参数是左值引用时,将会调用拷贝构造函数;当参数是右值引用时,将会调用转移构造函数。
2. emplace_back()用法总结

#include<iostream>
#include<vector>
using namespace std;
typedef struct testEmplace 
{
    testEmplace()
    {
        std::cout << "create testEmplace" << std::endl;
    }
 
    testEmplace(int a)
    {
        std::cout << "create testEmplace with param" << std::endl;
    }
 
    testEmplace(const testEmplace& src)
    {
        std::cout << "copy testEmplace" << std::endl;
    }
 
    testEmplace(testEmplace&& src)//左值的声明符号为”&”, 为了和左值区分,右值的声明符号为”&&”。
    {
        std::cout << "move testEmplace" << std::endl;
    }
 
    ~testEmplace()
    {
        std::cout << "destroy testEmplace" << std::endl;
    }
 
    testEmplace& operator = (const testEmplace& rht)
    {
        std::cout << " operator =() testEmplace" << std::endl;
    }
}testEmplace;
 
int main(int argc, char* argv[])
{
    std::vector<testEmplace> test;
    test.reserve(10); 
     
    testEmplace c;//构造
    test.emplace_back(c);//拷贝构造
    std::cout << "==============" << std::endl;
 
    test.emplace_back(1);//构造
    std::cout << "==============" << std::endl;
 
    test.emplace_back(testEmplace(12));
    std::cout << "==============" << std::endl;
 
    testEmplace d;//构造
    test.emplace_back(std::move(d));//移动构造
 	std::cout << "==============" << std::endl;
 	
    return 0;
}

输出结果:

create testEmplace
copy testEmplace
==============
create testEmplace with param
==============
create testEmplace with param
move testEmplace
destroy testEmplace
==============
create testEmplace
move testEmplace
==============
destroy testEmplace
destroy testEmplace
destroy testEmplace
destroy testEmplace
destroy testEmplace
destroy testEmplace

关于std::move()请看这里。如果还有其他用法,
关于push_back()和emplace_back()的执行效率对比请看这里。还请评论告知!谢谢

参考链接:
1).https://blog.csdn.net/qq_18998145/article/details/109848995
2).https://blog.csdn.net/xiaolewennofollow/article/details/52559306

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值