2012-07-27 127 views
0
template <class ElementType,int Dimension=1> 
class Vector : public vector<ElementType> { 
    public: 

    Vector & operator+= (const Vector & a){ 
     cout << " a " << a << endl; 
     transform (this->begin(), this->end(), a.begin(), this->begin(), plus<ElementType>()); 
     return *this; 
    }; 

    friend ostream & operator<< (ostream & stream, Vector t) { 
     stream << "("; 
     copy (t.begin(), t.end()-1, ostream_iterator<ElementType>(stream,",")); 
     return stream << *(t.end()-1) << ")"; 
    }; 

}; 

1)在運行時我收到錯誤消息:操作矢量+ =失敗

terminate called after throwing an instance of 'std::bad_alloc' 
what(): std::bad_alloc 

我發現,這個消息是由cout << " a " << a << endl;

2引起的)沒有完成該cout << .....操作但是一些垃圾被添加到this而不是a的內容。

有什麼建議嗎?

+3

爲什麼你使用't.end() - 1'?如果矢量爲空,則該值甚至不存在。 – jogojapan 2012-07-27 08:44:30

+0

您是否嘗試過在調試器中運行?您應該能夠通過檢查回溯來看到導致此問題的線路。 – 2012-07-27 08:44:34

+1

爲什麼你的運算符<<不適用於向量的const引用,而是向量對象? – ForEveR 2012-07-27 08:46:00

回答

2

存在着的std :: valarray中用於這一目的。

1

此輸出操作

friend ostream & operator<< (ostream & stream, Vector t) 

都不可能導致bad_alloc因爲它複製向量參數。

你可以試試這個,而不是

friend ostream & operator<< (ostream & stream, const Vector& t) 

,以避免這種情況。

要避免空載體沒有end()-1的問題,您可能需要將輸出置於if (!t.empty())之內。

最後這個表達式*(t.end()-1)可以簡化爲t.back()

+0

謝謝博,這消除了'bad_alloc'。 不清楚爲什麼,但工程。 廣東話它爲出現,而不是矢量值垃圾一樣的道理? – OlegG 2012-07-27 09:10:33

+0

原因了'bad_alloc'將是您在創建額外的副本時耗盡內存。 '+ ='運算符假定這兩個向量具有相同的大小。如果'a'的大小與添加的矢量大小不同,則完全不起作用。 – 2012-07-27 09:17:55