• google abseil c++ Tip of the Week #65: Putting Things in their Place 把对象放入容器的方式


    传统方法

    push_back

    1. 参数是内含类的构造方法的参数时,用这些参数调用那个构造方法构造一个临时对象,调用拷贝构造函数,参数是临时对象
    2. 参数是内含类的临时对象时(一个在push_back参数里构造的对象),对象自己会调用一次构造,一次析构,函数会调用一次拷贝构造;
    开销

    1.一个临时对象的构造
    2.一个临时对象的析构
    3.一个容器内对象的拷贝构造

    新方法

    emplace``emplace_back

    1. 参数是内含类的构造方法的参数时,用这些参数在容器内部应该存放的位置直接且只调用一次构造.
    2. 参数是内含类的临时对象时(一个在push_back参数里构造的对象),对象自己会调用一次构造,一次析构,函数会调用一次拷贝构造;

    总结

    emplace emplace_back 在比较新的c++已经会判断是否去调用push_back了,所以基本上都用emplace即可.

    测试代码

    #include 
    #include 
    #include 
    #include 
    #include 
    
    using namespace std;
    
    class Point2D{
    public:
        Point2D(int a,int b){
            std::cout<<"construct"<<std::endl;
            x=a;
            y=b;
        }
        Point2D(const Point2D& another){
            std::cout<<"copy construct"<<std::endl;
            x=another.x;
            y=another.y;
        }
        ~Point2D(){
            std::cout<<"destruct"<<std::endl;
        }
        int x;
        int y;
    };
    
    
    int main()
    {
        std::vector<Point2D> vec;
        vec.reserve(5);
        std::cout<<"________________________vec.push_back({1,2});_________________________"<<std::endl;
        vec.push_back({1,2});
        std::cout<<"________________________vec.push_back(Point2D(1,2));_________________________"<<std::endl;
        vec.push_back(Point2D(1,2));
        std::cout<<"________________________vec.emplace_back(1,2);_________________________"<<std::endl;
        vec.emplace_back(1,2);
        std::cout<<"________________________vec.emplace_back(Point2D(1,2));_________________________"<<std::endl;
        vec.emplace_back(Point2D(1,2));
        std::cout<<"vec.size="<<vec.size()<<std::endl;
        return 0;
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42
    • 43
    输出
    ________________________vec.push_back({1,2});_________________________
    construct
    copy construct
    destruct
    ________________________vec.push_back(Point2D(1,2));_________________________
    construct
    copy construct
    destruct
    ________________________vec.emplace_back(1,2);_________________________
    construct
    ________________________vec.emplace_back(Point2D(1,2));_________________________
    construct
    copy construct
    destruct
    vec.size=4
    destruct
    destruct
    destruct
    destruct
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
  • 相关阅读:
    【物理】斜面交点之处机械能/动量损失问题
    【已解决】解决Win7安装VS2013/VS2015结束时报错“无法建立到信任根颁发机构的证书链”的问题
    MySQL数据库 || 增删改查操作详解
    javaWeb项目部署到阿里云服务Linux系统
    算法通过村第十一关-位运算|青铜笔记|初始位运算
    MySQL TIMESTAMPDIFF函数的使用场景
    软件工程考试重点图形:数据流图画法介绍(★★★★★)
    新南威尔士大学研究团队延长量子相干时间实现基准增长100倍
    Codeforces 353D 思维
    maven升级版本后报错:Blocked mirror for repositories
  • 原文地址:https://blog.csdn.net/weixin_43950087/article/details/128136433