操作矢量+ =失败

问题描述:

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

为什么你的运算符 ForEveR 2012-07-27 08:46:00

存在着的std :: valarray中用于这一目的。

此输出操作

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