首页 > 编程 > C++ > 正文

C++11 emplace

2019-11-11 06:03:34
字体:
来源:转载
供稿:网友

emplace操作是C++11新特性,新引入的的三个成员emlace_front、empace 和 emplace_back,这些操作分别对应push_front、insert 和push_back,允许我们将元素放在容器头部、一个指定的位置和容器尾部,而他们之间却有一些不同,emplace*等操作根据参数执行相应的构造函数,如果传入的参数为容器元素类型则执行拷贝构造(这点和后三则相同),后三者在执行时会调用拷贝构造或则赋值运算符。

如下我们有一个类定义如下:

class emTest {public: emTest():data(0){ cout << "emTest()" << endl; } emTest(int data):data(data) { cout << "emTest(int)" << endl; } ~emTest() { cout << "~emTest()" << endl; } emTest(const emTest& that) { cout << "emTest(&)" << endl; data = that.data; } friend ostream& Operator<< (ostream& os, const emTest& that);PRivate: int data;};ostream& operator<< (ostream& os, const emTest& that) { os << that.data; return os;}

通过类定义我们看到,有默认构造函数,接收一个整形参数的构造函数,还有一个拷贝构造函数,咱们可以使用emplace在vector首部放置元素,使用方法如下:

//调用默认构造函数vec.emplace(vec.begin()); //调用接收int参数的构造函数vec.emplace(vec.begin(), 4);//调用拷贝构造函数emTest em;vec.emplace(vec.begin(), em);

main函数内的测试代码如下:

int main(){ vector<emTest> vm; vm.reserve(4); emTest et(3); cout << "------------------------------------" << endl; vm.emplace(vm.begin(), et); vm.emplace(vm.begin() + 1); vm.emplace(vm.begin() + 2, 4); for(vector<emTest>::iterator i = vm.begin(); i < vm.end(); i++){ cout<< *i; } printf("/n"); cout << "------------------------------------" << endl;}

测试输出如下:

emTest(int)------------------------------------emTest(&) //vm.emplace(vm.begin(), et); 拷贝构造emTest() //vm.emplace(vm.begin() + 1); 默认构造emTest(int) //vm.emplace(vm.begin() + 2, 4); 接收一个int参数的构造函数304 //vector内的元素值------------------------------------~emTest() //程序退出时释放vector内存空间~emTest()~emTest()~emTest()

我们对vector vm在使用push_front(vector没有提供),insert,push_back,时不能通过传入int来插入元素,于此同时在不同的平台上还会有较大的可能构造临时对象,效率可能相对较低。


发表评论 共有条评论
用户名: 密码:
验证码: 匿名发表

图片精选