zoukankan      html  css  js  c++  java
  • c++之使用emplace_back()取代push_back()

    使用emplace_back()取代push_back()

    • push_back()函数向容器中加入一个临时对象(右值元素)时, 首先会调用构造函数生成这个对象,然后条用拷贝构造函数将这个对象放入容器中, 最后释放临时对象。但是emplace_back()函数向容器中中加入临时对象, 临时对象原地构造,没有赋值或移动的操作。

    inserts a new element at the end of the vector, right after its current last element. This new element is constructed in place using args as the arguments for its constructor.
    This effectively increases the container size by one, which causes an automatic reallocation of the allocated storage space if -and only if- the new vector size surpasses the current vector capacity.
    The element is constructed in-place by calling allocator_traits::construct with args forwarded.
    A similar member function exists, push_back, which either copies or moves an existing object into the container.

    #include <vector>  
    #include <string>  
    #include <iostream>  
    
    struct President  
    {  
        std::string name;  
        std::string country;  
        int year;  
    
        President(std::string p_name, std::string p_country, int p_year)  
            : name(std::move(p_name)), country(std::move(p_country)), year(p_year)  
        {  
            std::cout << "I am being constructed.
    ";  
        }
        President(const President& other)
            : name(std::move(other.name)), country(std::move(other.country)), year(other.year)
        {
            std::cout << "I am being copy constructed.
    ";
        }
        President(President&& other)  
            : name(std::move(other.name)), country(std::move(other.country)), year(other.year)  
        {  
            std::cout << "I am being moved.
    ";  
        }  
        President& operator=(const President& other);  
    };  
    
    int main()  
    {  
        std::vector<President> elections;  
        std::cout << "emplace_back:
    ";  
        elections.emplace_back("Nelson Mandela", "South Africa", 1994); //没有类的创建  
    
        std::vector<President> reElections;  
        std::cout << "
    push_back:
    ";  
        reElections.push_back(President("Franklin Delano Roosevelt", "the USA", 1936));  
    
        std::cout << "
    Contents:
    ";  
        for (President const& president: elections) {  
           std::cout << president.name << " was elected president of "  
                << president.country << " in " << president.year << ".
    ";  
        }  
        for (President const& president: reElections) {  
            std::cout << president.name << " was re-elected president of "  
                << president.country << " in " << president.year << ".
    ";  
    }
    
    emplace_back:
    I am being constructed.
    
    push_back:
    I am being constructed.
    I am being moved.
    
    Contents:
    Nelson Mandela was elected president of South Africa in 1994.
    

    使用案例:

    std::vector<int> v_int;
    v_int.emplace_back(value);
    
    pcl::PointCloud<pcl::PointXYZI>::Ptr cloud;
    cloud->points.emplace_back(point);
    
    • 据统计,emplace_back()函数要比push_back()函数要快一倍。

    参考

    emplace_back() 和 push_back 的区别 - 随便记点东西 - CSDN博客

  • 相关阅读:
    004-spring cache-声明性的基于XML的缓存
    003-spring cache-JCache (JSR-107) annotations
    002-spring cache 基于注解的缓存-02详细-Cacheable 、CachePut、CacheEvict、Caching、CacheConfig、EnableCaching、自定义
    002-spring cache 基于注解的缓存-01-关键注解概述、spel、缓存Key 与 缓存解析器
    001-springboot cache 简介、基础使用
    tools-eclipse-004-UML图安装
    001-Spring的设计理念和整体架构
    java-信息安全(十八)java加密解密,签名等总结
    005-java的Annotation
    002-原始jpa以及基本加载过程,基本sql使用
  • 原文地址:https://www.cnblogs.com/ChrisCoder/p/9919646.html
Copyright © 2011-2022 走看看