- 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