2013-08-08 3 views
5

Ich schreibe einen FIR-Filter, der running average einer Eingabefolge berechnen soll.Wie iteriere ich `std :: stack` Elemente in einer for-Schleife?

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; 
}; 

Ich habe Probleme beim Iterieren des std::stack Objekts Registers. Im Gegensatz zu anderen STL-Containern gibt es keinen Iterator oder Direktzugriffsoperator.

Wie schleife ich und std::stack Objekt?

Ein Beispiel Nutzung:

RunningAverager ra(10); 

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

Sie können nicht über einen Stapel iterieren. Das ist der ganze Sinn eines Stapels. –

+0

Ich denke, Sie sollten etwas wie 'boost :: circular_buffer' anstelle von' std :: stack' für den Grund verwenden, @KerrekSB genannt. – arne

Antwort

0

Sie drücken die Werte auf dem Stapel in der ersten Schleife. So können Sie sie in der zweiten Schleife absetzen und addieren sie und zählen sie, um den Durchschnitt zu erhalten.

1

Sie könnten anstelle eines Stapels einen std::deque verwenden, indem Sie push_front und pop_front verwenden.

1

Es ist einfacher, std::deque Container für diese bestimmte Anwendung zu verwenden.

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; 
}; 
Verwandte Themen