Senior Dogsbody Engineer  

emplace_back()是c++11的新特性。和push_back()的区别在于push_back()方法要调用构造函数和复制构造函数,这也就代表着要先构造一个临时对象,然后把临时的copy构造函数拷贝或者移动到容器最后面。
而emplace_back()在实现时,则是直接在容器的尾部创建这个元素,省去了拷贝或移动元素的过程。

vector<pair<int, int>> ret;
ret.push_back(1,1)//会报错,因为没有构造一个临时对象
ret.push_back(pair(1,1))//不会报错,因为构成了一个pair对象
ret.emplace_back(1,1)//不会报错,因为直接在容器的尾部创建对象

 

 

复制代码
class A {
public:
    A(int i){
        str = to_string(i);
        cout << "构造函数" <<++i<< endl; 
    }
    ~A(){}
    A(const A& a): str(a.str){
        cout << "拷贝构造" <<++j<< endl;
    }
 
public:
    string str;
};
 
int main(){
    vector<A> vec;
    vec.reserve(10);//开辟capacity
    for(int i=0;i<10;i++){
        vec.push_back(i); //调用了10次构造函数和10次拷贝构造函数,
//        vec.emplace_back(i);  //调用了10次构造函数,一次拷贝构造函数都没有调用过
    }
}
复制代码

 

C++11 新特性—EMPLACE操作

新标准引入了:

  • emplace_front : 在容器的头部创建元素,返回void;对应push_front。
  • emplace:在迭代器指向的元素之前创建一个元素,并返回新添加元素的迭代器;对应insert 。
  • emplace_back : 在容器的尾部创建元素,返回void;对应push_back。 

这些操作构造而不是拷贝元素到容器中,即直接调用构造函数,不会调用拷贝构造函数,省去了拷贝所需的时间和资源,更加高效。

 

emplace操作与push、insert的区别:
emplace成员函数利用传入的参数在容器管理的内存中直接构造元素;push与insert成员函数则是将传入的元素类型对象拷贝到容器中,或创建一个局部临时对象,并将其压入容器中。

注意:emplace函数的参数根据元素类型而变化,参数必须与元素类型的构造函数相匹配。

此外,可以利用emplace函数将char型字符转换成string类型字符串压入容器中:

 vector<string>v;
  char ch = 'a';
  v.emplace_back(1, ch);//利用string(int n,char c)构造n个c的字符串
posted on   高级打杂工程师  阅读(241)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· 阿里巴巴 QwQ-32B真的超越了 DeepSeek R-1吗?
· 【译】Visual Studio 中新的强大生产力特性
· 【设计模式】告别冗长if-else语句:使用策略模式优化代码结构
· AI与.NET技术实操系列(六):基于图像分类模型对图像进行分类
 
点击右上角即可分享
微信分享提示