我的問題是:以下關於STL堆棧的代碼是否正確?如何在STL堆棧中保存用戶定義的類型?
在代碼,配合物是用構造和析構定義的用戶定義的類。 放置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;
}
正確。我沒有意識到在push(c)中調用拷貝構造函數。注意push的定義:void push(const T&x)。我認爲它就像foo(const T&x),其中x是通過引用傳遞的,所以沒有構造新的複合體。但似乎push(const T&x)像複製構造一樣工作:complex(const T&x)。 – user389955 2013-05-08 03:13:24
@ user389955:在調用push()時,新的'complex'不是構造的。它被構建在push的內部,因爲堆棧保存了你傳入的值的拷貝* – nobar 2013-05-08 13:05:58
@nobar:thx我明白了。 – user389955 2013-05-16 21:15:35