这是我在emplace上的简单程序。当我在矢量上使用emplace时,我看到复制构造函数被调用了。但是,当我在set上使用emplace时,我看不到复制构造函数被调用。我在这里漏掉了什么概念?
#include <iostream>
#include <vector>
#include <set>
using namespace std;
class MyData
{
private:
int x;
public:
int getX()
{
return x;
}
MyData(int val): x(val) { cout<<"Constructor invoked--"<<endl; }
MyData(const MyData &rhs) { cout<<"Copy Constructor Invoked"<<endl; x = rhs.x; }
bool operator<(const MyData &lhs) const { return lhs.x < x; }
};
int main(int argc, char **argv)
{
MyData d1(5);
cout<<d1.getX()<<endl;
vector<MyData> vx;
auto it = vx.begin();
vx.insert(it,d1);
cout<<"Calling emplace for vector"<<endl;
vx.emplace_back(15);
set<MyData> mySet;
cout<<"mySet emplace invoking"<<endl;
mySet.emplace(20);
return 0;
}
这是我的结果。
./emplace.out
Constructor invoked--
5
Copy Constructor Invoked
Calling emplace for vector
Constructor invoked--
Copy Constructor Invoked
mySet emplace invoking
Constructor invoked--
发布于 2021-07-20 01:57:55
根据定义,向量中的所有值都必须在连续的内存中。将值添加到向量中意味着,值中的每一次都会重新分配向量中的所有值,以容纳更多的值。每次重新分配都会为进一步的增长预留额外的内存,一旦多余的值用完,向量就会再次重新分配。这就是向量工作原理的概要。
在这种情况下,在调用emplace()
之前,向量中已经有一个值。
额外的复制构造实际上是向量重新分配其内容的结果--一个现有的值--作为emplace()
的一部分,在向量中加入一个新值。这是通过复制构造重新分配的向量中的值来完成的。
std::set
不会重新分配其内容,因此这些情况都不会发生。
https://stackoverflow.com/questions/68448647
复制