当前位置: 主页 > 程序 >

C++11容器中新增加的emplace相关函数的使用

时间:2021-10-04  作者:haden   点击:
【摘要】C++11中,针对顺序容器(如 vector 、 deque 、 list ),新标准引入了三个新成员函数: emplace_front 、 emplace 和 emplace_back ,这些操作构造而不是拷贝元素。这些操作分别对应 push_front 、 inser

C++11中,针对顺序容器(如vectordequelist),新标准引入了三个新成员函数:emplace_frontemplaceemplace_back,这些操作构造而不是拷贝元素。这些操作分别对应push_frontinsertpush_back,允许我们将元素放置在容器头部、一个指定位置之前或容器尾部。

当调用pushinsert成员函数时,我们将元素类型的对象传递给它们,这些对象被拷贝到容器中。而当我们调用一个emplace成员函数时,则是将参数传递给元素类型的构造函数。emplace成员使用这些参数在容器管理的内存空间中直接构造元素。

emplace函数的参数根据元素类型而变化,参数必须与元素类型的构造函数相匹配。emplace函数在容器中直接构造元素。传递给emplace函数的参数必须与元素类型的构造函数相匹配。

其它容器中,std::forward_list中的emplace_afteremplace_front函数,std::map/std::multimap中的emplaceemplace_hint函数,std::set/std::multiset中的emplaceemplace_hintstd::stack中的emplace函数,等emplace相似函数操作也均是构造而不是拷贝元素。

emplace相关函数可以减少内存拷贝和移动。当插入rvalue,它节约了一次move构造,当插入lvalue,它节约了一次copy构造。

配合下面的测试代码理解:

#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 << ".";
    }
}

代码输出为:

emplace_back:
I am being constructed.

push_back:
I am being constructed.
I am being moved.
顶一下
(0)
0%
踩一下
(0)
0%
发表评论
请自觉遵守互联网相关的政策法规,严禁发布色情、暴力、反动的言论。
评价:
验证码: 点击我更换图片

推荐内容