容器的emplace成员函数

来源:互联网 发布:卸载软件找不到程序 编辑:程序博客网 时间:2024/05/21 06:32
    在C++新标准中引入了三个新成员---emplace_front、emplace、和emplace_back,这些操作是构造而不是拷贝元素。这些操作分别对应分别是push_front、insert、push_back,允许我们将元素放在容器头部、一个指定位置之前或容器尾部。我们以下拿push_back和emplace_push来举例。其他的成员函数原理是一样的。当我们调用push_back函数时,我们将元素类型的对象当做参数传递给元素类型的赋值构造函数。而当我们调用一个emplace_back成员函数时,则是将参数传递给元素类型的相应的构造函数。emplace使用这些参数在容器管理的内存空间中直接构造函数。例如:我们自己定义一个Foo类。在类中我们自己定义了两个构造函数、一个赋值构造函数、一个重载赋值运算操作符和一个析构函数。
class Foo{private:int val;string str;public:Foo() :val(0), str(""){cout << "默认构造函数" << endl;}Foo(int v, string s) :val(v), str(s){cout << "两个参数的构造函数" << endl;}Foo(const Foo &rhs){val = rhs.val;str = rhs.str;cout << "赋值构造函数" << endl;}Foo &operator=(const Foo &rhs){val = rhs.val;str = rhs.str;cout << "赋值操作符重载" << endl;return *this;}~Foo(){cout << "析构函数" << endl;}};
假如我们定义一个vector<Foo> ve容器。我们分别使用push_back和emplace_back成员函数向容器中添加元素。如下:
vector<Foo> ve;ve.push_back(Foo(19, "Jay"));ve.emplace_back(18,"Tom");
其中对emplace_back和push_back调用都会创建新的Foo对象,在调用emplace_back时,会在容器中直接创建对象,调用的是两个参数的构造函数。而调用push_back则会创建一个临时对象,然后用该临时对象作为参数传递给Foo类型的赋值构造函数。最后析构该临时对象。输出结果如下:
注意:emplace函数在容器中直接构造元素,传递给emplace函数的参数必须与元素类型的构造函数匹配。
0 0
原创粉丝点击