emplace_back與push_back的區別

來源:互聯網
上載者:User

標籤:style   blog   http   color   os   io   strong   for   

std::vector::emplace_back  C++ Containers library std::vector 
template< class... Args >
void emplace_back( Args&&... args );
  (since C++11)
     

Appends a new element to the end of the container. The element is constructed in-place, i.e. no copy or move operations are performed. The constructor of the element is called with exactly the same arguments that are supplied to the function.

If the new size() is greater than capacity() then all iterators and references (including the past-the-end iterator) are invalidated. Otherwise only the past-the-end iterator is invalidated.

Parameters
args - arguments to forward to the constructor of the element
Return value

(none)

Complexity

Constant.

Exceptions

If an exception is thrown, this function has no effect (strong exception guarantee). If T‘s move constructor is not noexcept and is not CopyInsertable into *this, vector will use the throwing move constructor. If it throws, the guarantee is waived and the effects are unspecified.

Notes

The specialization std::vector<bool> did not have emplace_back() member until C++14.

Example

The following code uses emplace_back to append an object of type President to a std::vector. It demonstrates how emplace_back forwards parameters to the President constructor and shows how using emplace_back avoids the extra copy or move operation required when using push_back.

#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(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) = default;}; 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";    }}

Output:

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.Franklin Delano Roosevelt was re-elected president of the USA in 1936.

 

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.