我写了一个简单的矢量程序,在其中我得到了以下输出。你能帮我理解它的输出吗?
I have written one simple vector program in which i am getting following output. Can you help me to understand it's output?
以下是带有输出的代码片段。
#include<iostream>
#include<vector>
using namespace std;
class VectDemo
{
public:
VectDemo()
{
cout<<"Contructor"<<endl;
}
~VectDemo()
{
cout<<"Destructor"<<endl;
}
};
int main()
{
vector<VectDemo> VectOfObj;
cout<<"Size = "<<VectOfObj.size()<<endl;
for(int i= 0;i<2;i++)
{
VectOfObj.push_back(VectDemo());
}
cout<<"Size = "<<VectOfObj.size()<<endl;
cout<<"Capacity = "<<VectOfObj.capacity()<<endl;
return 0;
}
输出: 大小 = 0
构造器
破坏者
构造器
破坏者
破坏者
大小 = 2
容量 = 2
破坏者
破坏者
构造函数和析构函数日志消息不平衡,因为VectDemo
没有记录正在调用的复制构造函数。VectOfObj.push_back(VectDemo())
创建一个临时VectDemo
对象,然后必须将其复制到矢量中。此外,当向量的capacity
增长时,矢量的元素也会被复制。在构造副本时不记录,仅在销毁副本时进行日志记录。
试试这个:
#include<iostream>
#include<vector>
using namespace std;
char nextID = 'A';
class VectDemo
{
public:
char id;
VectDemo()
{
id = nextID++;
cout<<"Default Constructor "<<id<<endl;
}
VectDemo(const VectDemo &src)
{
id = nextID++;
cout<<"Copy Constructor "<<src.id<<"->"<<id<<endl;
}
~VectDemo()
{
cout<<"Destructor "<<id<<endl;
}
};
int main()
{
vector<VectDemo> VectOfObj;
cout<<"Before Loop"<<endl;
cout<<"Size = "<<VectOfObj.size()<<" Capacity = "<<VectOfObj.capacity()<<endl;
cout<<"Entering Loop"<<endl;
for(int i= 1;i<=2;i++)
{
cout<<"push_back #"<<i<<endl;
VectOfObj.push_back(VectDemo());
}
cout<<"After Loop"<<endl;
cout<<"Size = "<<VectOfObj.size()<<" Capacity = "<<VectOfObj.capacity()<<endl;
return 0;
}
输出:
Before Loop
Size = 0 Capacity = 0
Entering Loop
push_back #1
Default Constructor A // temp created
Copy Constructor A->B // VectOfObj[0] created from temp
Destructor A // temp destroyed
push_back #2
Default Constructor C // temp created
Copy Constructor C->D // VectOfObj[1] created from temp
Copy Constructor B->E // new VectOfObj[0] created from old VectOfObj[0]
Destructor B // old VectOfObj[0] destroyed
Destructor C // temp destroyed
After Loop
Size = 2 Capacity = 2
Destructor E // VectOfObj[1] destroyed
Destructor D // VectOfObj[0] destroyed
现场演示
如果您使用的是 C++11 或更高版本,则添加移动构造函数会稍微改变一些内容:
#include<iostream>
#include<vector>
using namespace std;
char nextID = 'A';
class VectDemo
{
public:
char id;
VectDemo()
{
id = nextID++;
cout<<"Default Constructor "<<id<<endl;
}
VectDemo(const VectDemo &src)
{
id = nextID++;
cout<<"Copy Constructor "<<src.id<<"->"<<id<<endl;
}
VectDemo(VectDemo &&src)
{
id = nextID++;
cout<<"Move Constructor "<<src.id<<"->"<<id<<endl;
}
~VectDemo()
{
cout<<"Destructor "<<id<<endl;
}
};
int main()
{
vector<VectDemo> VectOfObj;
cout<<"Before Loop"<<endl;
cout<<"Size = "<<VectOfObj.size()<<" Capacity = "<<VectOfObj.capacity()<<endl;
cout<<"Entering Loop"<<endl;
for(int i= 1;i<=2;i++)
{
cout<<"push_back #"<<i<<endl;
VectOfObj.push_back(VectDemo());
}
cout<<"After Loop"<<endl;
cout<<"Size = "<<VectOfObj.size()<<" Capacity = "<<VectOfObj.capacity()<<endl;
return 0;
}
输出
Before Loop
Size = 0 Capacity = 0
Entering Loop
push_back #1
Default Constructor A // temp created
Move Constructor A->B // VectOfObj[0] created from temp
Destructor A // temp destroyed
push_back #2
Default Constructor C // temp created
Move Constructor C->D // VectOfObj[1] created from temp
Copy Constructor B->E // new VectOfObj[0] created from old VectOfObj[0]
Destructor B // old VectOfObj[0] destroyed
Destructor C // temp destroyed
After Loop
Size = 2 Capacity = 2
Destructor E // VectOfObj[1] destroyed
Destructor D // VectOfObj[0] destroyed
现场演示
而且,正如@walnut提到的,如果你将移动构造函数标记为noexcept
,编译器可以进一步优化一个push_back()
,使向量capacity
增长,并且输出略有变化:
#include<iostream>
#include<vector>
using namespace std;
char nextID = 'A';
class VectDemo
{
public:
char id;
VectDemo()
{
id = nextID++;
cout<<"Default Constructor "<<id<<endl;
}
VectDemo(const VectDemo &src)
{
id = nextID++;
cout<<"Copy Constructor "<<src.id<<"->"<<id<<endl;
}
VectDemo(VectDemo &&src) noexcept
{
id = nextID++;
cout<<"Move Constructor "<<src.id<<"->"<<id<<endl;
}
~VectDemo()
{
cout<<"Destructor "<<id<<endl;
}
};
int main()
{
vector<VectDemo> VectOfObj;
cout<<"Before Loop"<<endl;
cout<<"Size = "<<VectOfObj.size()<<" Capacity = "<<VectOfObj.capacity()<<endl;
cout<<"Entering Loop"<<endl;
for(int i= 1;i<=2;i++)
{
cout<<"push_back #"<<i<<endl;
VectOfObj.push_back(VectDemo());
}
cout<<"After Loop"<<endl;
cout<<"Size = "<<VectOfObj.size()<<" Capacity = "<<VectOfObj.capacity()<<endl;
return 0;
}
输出
Before Loop
Size = 0 Capacity = 0
Entering Loop
push_back #1
Default Constructor A // temp created
Move Constructor A->B // VectOfObj[0] created from temp
Destructor A // temp destroyed
push_back #2
Default Constructor C // temp created
Move Constructor C->D // VectOfObj[1] created from temp
Move Constructor B->E // new VectOfObj[0] created from old VectOfObj[0]
Destructor B // old VectOfObj[0] destroyed
Destructor C // temp destroyed
After Loop
Size = 2 Capacity = 2
Destructor E // VectOfObj[1] destroyed
Destructor D // VectOfObj[0] destroyed
现场演示
相关文章:
- 当我在其中一个线程执行中(在activemq-cpp中)捕获到特定值时,我如何终止/停止所有其他线程
- 控制台输出在 Qt5 中未正确显示
- 修改链表主函数代码,用户将在其中输入节点的索引和数据以及正确的消息
- 如果我们在其中输入一个整数,则字符会给出整数作为输出,但是当分配给它一个整数时,这不会发生。为什么?
- 我写了一个简单的矢量程序,在其中我得到了以下输出。你能帮我理解它的输出吗?
- 打印输出在主,而不是在函数中
- 为什么我的数组输出一个不在其中的元素
- 定义在其中执行不同代码路径的代码节
- C ++使用getline,输出在开头带有一个额外的空间
- 这是我的 .h 文件的一些错误,当我在其中包含我的类模板时,它显示 [错误] 未终止 #ifndef
- 是否可以检索与柯南包管理器一起打包的库的源代码,以便在其中进行调试?
- 为什么我的输出在到达代码的这一部分时冻结?
- C :宏参数可以在其中有空间吗?
- C++要在其中添加接口功能的类层次结构
- strtoull() 的输出在转换为双精度然后又转换为 uint64_t 时会失去精度
- 如何制作一个结构程序,在其中可以存储无限量的数据,以便每次您想要时都可以将另一个产品添加到列表中?
- 程序在其中一个案例完成后终止,但对于其他情况则不终止
- openCv 3中的等效polyfit函数在其中
- 为什么输出在睡眠后没有换行符?
- 我想创建一个函数,我可以在其中输入一个字符串,它会输出一个混乱的字符串版本