2013-08-08 28 views
5

Bir giriş dizisinin running average hesaplaması gereken bir FIR filtresi yazıyorum.std :: stack` öğelerini bir for döngüsünde nasıl yineleyebilirim?

class RunningAverager 
{ 
    public: 
     RunningAverager(uint64_t FilterOrder) 
     { 
      for (uint64_t i=0; i<FilterOrder; i++) 
      { 
       Registers.push(0); 
      } 
     } 
     uint64_t GetAverage(uint64_t NewInput) 
     { 
      Registers.push(NewInput); 
      Registers.pop(); 
      return GetAverage(); 
     } 
     uint64_t GetAverage() const 
     { 
      uint64_t Sum = 0; 
      //for (uint64_t i=0; i<Registers.size(); i++)  <-- Works 
      for (std::stack<uint64_t>::const_reference ref=Registers.begin(); ref!=Registers.end(); ???) 
      { // begin() and end() methods do not exist for std::stack 
       //Sum += Registers[i];  Doesn't work, because the [] operator is not overloaded. 
       Sum += ref; 
      } 
      return Sum/Registers.size(); 
     } 
    private: 
     std::stack<uint64_t> Registers; 
}; 

sorun std::stack nesneyi Registers yineleme yaşıyorum. Diğer STL kapsayıcılarının aksine, bir yineleyici veya rasgele erişim operatörü vermez.

Döngü ve std::stack nesnesi nasıl olur?

bir örnek kullanımı:

RunningAverager ra(10); 

while(...) 
{ 
    FilteredSpeed = ra.GetAverage(ActualSpeed); 
} 
+3

Yığın üzerinde yineleme yapamazsınız. Bu bir yığının bütün noktası. –

+0

Sanırım, @KerrekSB'nin nedeninden dolayı std :: stack' yerine "boost :: circular_buffer" gibi bir şey kullanmalısınız. – arne

cevap

0

İlk döngü yığın değerleri itin. Böylece onları ikinci döngüde açıp ekleyebilir ve ortalamayı elde etmek için onları sayarsınız.

1

push_front ve pop_front kullanarak yığın yerine std::deque kullanabilirsiniz.

1

Bu özel uygulama için std::deque kapsayıcısını kullanmak daha kolaydır.

class RunningAverage 
{ 
    public: 
     RunningAverage(uint64_t Order) 
     { 
      for (uint64_t i=0; i<Order; i++) 
      { 
       Registers.resize(Order, 0); 
      } 
     } 
     uint64_t GetAverage(uint64_t NewInput) 
     { 
      Registers.push_back(NewInput); 
      Registers.pop_front(); 
      return GetAverage(); 
     } 
     uint64_t GetAverage() const 
     { 
      uint64_t Sum = 0; 
      for (std::deque<uint64_t>::const_iterator it=Registers.begin(); it<Registers.end(); ++it) 
      { 
       Sum += *it; 
      } 
      return Sum/Registers.size(); 
     } 
    private: 
     std::deque<uint64_t> Registers; 
};