gpt4 book ai didi

c++ - 如何在 STL 堆栈中保存用户定义的类型?

转载 作者:行者123 更新时间:2023-11-30 02:55:31 25 4
gpt4 key购买 nike

我的问题是:下面关于STL栈的代码是否正确?

在代码中,complex 是一个用户定义的类,定义了构造函数和析构函数。在地方1之后,复杂的构造函数和析构函数分别被调用了5次,在位置 2 之后,由于 pop(),复杂的析构函数再次被调用 5 次。所以总的来说,析构函数被调用的次数多于构造函数。 IMO 它不应该发生。我的代码正确吗?如果不正确如何纠正?假设我仍然使用堆栈而不是堆栈

#include <stack>  
#include "complex.h"
using namespace std;
void test_stack(){
stack<complex> mystack2;
cout << "Pushing complex..." << endl;
for (int i=0; i<5; ++i) {
complex c(i,i);
mystack2.push(c);
}
//place 1
cout << "Popping out complex..." << endl;
while (!mystack2.empty())
{
cout << " " << mystack2.top();
mystack2.pop(); //void pop();
}
//place 2
cout << endl;
}

最佳答案

要回答您原来的问题,您的代码没有任何问题。但是,你的理解有点偏差。

正如其他人所指出的,mystack2.push(c) 将调用 complex 的复制构造函数。因此,您总共调用了 5 次构造函数、5 次复制构造函数和 10 次析构函数。

这提出了几个要点。如您所见,以下代码:

for (int i=0; i<5; ++i) {   
complex c(i,i);
mystack2.push(c);
}

首先创建一个complex (c),然后将一个拷贝添加到堆栈中,当c超出范围时,原始的complex被销毁。在 C++11 中,不需要额外的拷贝,您可以执行以下操作:

for (int i=0; i<5; ++i) {   
mystack2.emplace(i, i);
}

这将让堆栈完成对象的构造,无需复制。

我认为导致您混淆构造函数被调用 10 次的另一点是,您说 complex 仅定义构造函数和析构函数。如果您不定义复制构造函数(并且不将其标记为私有(private)或已删除),编译器将自动创建一个。实际上,它比 C++11 多了一点,我会引导您查看这个问题以获取详细信息 - Conditions for automatic generation of default/copy/move ctor and copy/move assignment operator? .不过,需要注意的重要一点是,在这种情况下,您对 push 的调用肯定是在调用编译器生成的复制构造函数。

关于c++ - 如何在 STL 堆栈中保存用户定义的类型?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16430470/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com