当前位置:首页 > 芯闻号 > 充电吧
[导读]问题还是老问题考虑下面的Rect类:struct Rect {     Rect(int l, int t, int r, int b)         :left{l}, top{t}       

问题还是老问题


考虑下面的Rect类:


struct Rect
{
    Rect(int l, int t, int r, int b)
        :left{l}, top{t}
        ,right{r}, bottom{b}
    {}
    int left;
    int top;
    int right;
    int bottom;
};


当需要向容器添加Rect对象时,代码大致是这样的:


std::list


在调用push_front时,首先构造一个临时的Rect对象传递给push_front方法,然后在push_front的内部,在复制一个Rect对象添加到容器中。全过程会发生一次创建动作和一次拷贝动作,才能将对象的内容添加到list当中去。


emplace成员


为了减少拷贝动作的次数,当然可以使用右值引用参数的成员函数。除此之外,C++11还提供了另一种方法:emplace成员。使用这个成员可以直接传递用于生成对象的参数,对象的创建过程交给容器去执行:


std::list


用法非常简单,只要保证参数和元素构造函数的参数相同即可。


除了emplace_front以外,C++11还提供了emplace和emplace_bak方法,分别对应insert和push_back方法。


emplace语义


为了更好的理解和说明emplace,先去百度查了一下,结果如下:


并没有发现什么有价值的线索,权当学英语了。。。


作者观点


当创建对象的目的只是为了将其添加到容器中时,emplace提供了右值引用以外的另一个选择。


本站声明: 本文章由作者或相关机构授权发布,目的在于传递更多信息,并不代表本站赞同其观点,本站亦不保证或承诺内容真实性等。需要转载请联系该专栏作者,如若文章内容侵犯您的权益,请及时联系本站删除( 邮箱:macysun@21ic.com )。
换一批
延伸阅读
关闭