当前位置: 代码迷 >> 综合 >> vector push_back()和emplace_back()用法总结
  详细解决方案

vector push_back()和emplace_back()用法总结

热度:96   发布时间:2023-12-15 15:09:16.0
  1. push_back()用法总结
#include<iostream>
#include<vector>
using namespace std;
typedef struct testEmplace 
{
    testEmplace(){
    std::cout << "create testEmplace" << std::endl;}testEmplace(int a){
    std::cout << "create testEmplace with param" << std::endl;}testEmplace(const testEmplace& src){
    std::cout << "copy testEmplace" << std::endl;}testEmplace(testEmplace&& src){
    std::cout << "move testEmplace" << std::endl;}~testEmplace(){
    std::cout << "destroy testEmplace" << std::endl;}testEmplace& operator = (const testEmplace& rht){
    std::cout << " operator =() testEmplace" << std::endl;}
}testEmplace;int main(int argc, char* argv[])
{
    std::vector<testEmplace> test;test.reserve(10); //指定初始容量,防止后续加入元素操作引发容器自动增长testEmplace a;//构造test.push_back(a);//拷贝构造std::cout << "==============" << std::endl;testEmplace b;//构造test.push_back(std::move(b));//移动构造std::cout << "==============" << std::endl; test.push_back(1);//构造临时对象+移动构造std::cout << "==============" << std::endl;test.push_back(testEmplace(12));//构造临时对象+移动构造std::cout << "==============" << std::endl;return 0;
}

输出结果:

create testEmplace
copy testEmplace
==============
create testEmplace
move testEmplace
==============
create testEmplace with param
move testEmplace
destroy testEmplace
==============
create testEmplace with param
move testEmplace
destroy testEmplace
==============
destroy testEmplace
destroy testEmplace
destroy testEmplace
destroy testEmplace
destroy testEmplace
destroy testEmplace

通过运行上面的代码可知:当push_back()的参数是左值引用时,将会调用拷贝构造函数;当参数是右值引用时,将会调用转移构造函数。
2. emplace_back()用法总结

#include<iostream>
#include<vector>
using namespace std;
typedef struct testEmplace 
{
    testEmplace(){
    std::cout << "create testEmplace" << std::endl;}testEmplace(int a){
    std::cout << "create testEmplace with param" << std::endl;}testEmplace(const testEmplace& src){
    std::cout << "copy testEmplace" << std::endl;}testEmplace(testEmplace&& src)//左值的声明符号为”&”, 为了和左值区分,右值的声明符号为”&&”。{
    std::cout << "move testEmplace" << std::endl;}~testEmplace(){
    std::cout << "destroy testEmplace" << std::endl;}testEmplace& operator = (const testEmplace& rht){
    std::cout << " operator =() testEmplace" << std::endl;}
}testEmplace;int main(int argc, char* argv[])
{
    std::vector<testEmplace> test;test.reserve(10); testEmplace c;//构造test.emplace_back(c);//拷贝构造std::cout << "==============" << std::endl;test.emplace_back(1);//构造std::cout << "==============" << std::endl;test.emplace_back(testEmplace(12));std::cout << "==============" << std::endl;testEmplace d;//构造test.emplace_back(std::move(d));//移动构造std::cout << "==============" << std::endl;return 0;
}

输出结果:

create testEmplace
copy testEmplace
==============
create testEmplace with param
==============
create testEmplace with param
move testEmplace
destroy testEmplace
==============
create testEmplace
move testEmplace
==============
destroy testEmplace
destroy testEmplace
destroy testEmplace
destroy testEmplace
destroy testEmplace
destroy testEmplace

关于std::move()请看这里。如果还有其他用法,
关于push_back()和emplace_back()的执行效率对比请看这里。还请评论告知!谢谢

参考链接:
1).https://blog.csdn.net/qq_18998145/article/details/109848995
2).https://blog.csdn.net/xiaolewennofollow/article/details/52559306