zoukankan      html  css  js  c++  java
  • emplace_back与push_back的区别

    std::vector::emplace_back

     
    templateclass... 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.
    ";
        }
        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) = default;
    };
     
    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 << ".
    ";
        }
    }

    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.
  • 相关阅读:
    [转]VC++ ^和gcnew
    OPPM 一页纸项目管理 OnePage Project Management
    [转]基础总结篇之五:BroadcastReceiver应用详解 .
    [转]深入浅出Java设计模式之备忘录模式
    [转]面向对象的5条基本设计原则
    [转]UED大全
    [转]VC++动态链接库(DLL)编程深入浅出(zz)
    只有壮年时的不遗余力 才能支撑一生的坎坷与幸福
    [书目20121024]当责 AccountaBility
    node.js入门
  • 原文地址:https://www.cnblogs.com/wuchanming/p/3913492.html
Copyright © 2011-2022 走看看