1. 程式人生 > >使用emplace_back()取代push_back()

使用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.\n";  
    }
    President(const President& other)
        : name(std::move(other.name)), country(std::move(other.country)), year(other.year)
    {
        std::cout << "I am being copy constructed.\n";
    }
    President(President&& other)  
        : name(std::move(other.name)), country(std::move(other.country)), year(other.year)  
    {  
        std::cout << "I am being moved.\n";  
    }  
    President& operator=(const President& other);  
};  

int main()  
{  
    std::vector<President> elections;  
    std::cout << "emplace_back:\n";  
    elections.emplace_back("Nelson Mandela", "South Africa", 1994); //沒有類的建立  

    std::vector<President> reElections;  
    std::cout << "\npush_back:\n";  
    reElections.push_back(President("Franklin Delano Roosevelt", "the USA", 1936));  

    std::cout << "\nContents:\n";  
    for (President const& president: elections) {  
       std::cout << president.name << " was elected president of "  
            << president.country << " in " << president.year << ".\n";  
    }  
    for (President const& president: reElections) {  
        std::cout << president.name << " was re-elected president of "  
            << president.country << " in " << president.year << ".\n";  
}
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部落格