C++11的STL中新增加了emplace() 函数和 emplace_back() 函数,用来实现insert() 函数和 push_back() 函数的功能。

如果容器中的元素是对象:

emplace()  函数的功能是可以直接将参数传给对象的构造函数,在容器中构造出一个对象,从而实现 0 拷贝。(底层机制是调用placement new即布局new运算符来实现的)。

假设类MyClass 有构造函数 MyClass(T1 val1,T2 val2);

那么container.emplace(container.end() ,val1, val2) 可以直接在容器的末尾构造出一个对象,如果用container.insert(container.end() ,MyClass(val1,val2)) 会先构造一个对象,然后拷贝到容器的末尾。

同样的,emplace_back() 和 push_back() 的差别类似。

如果是一个已有的对象 MyClass obj;container.emplace(..., obj)  和  container.emplace_back(obj)的效率差不多。

Logo

权威|前沿|技术|干货|国内首个API全生命周期开发者社区

更多推荐