2013-08-08 12 views
5

私は入力シーケンスのrunning averageを計算するはずのFIRフィルタを書いています。forループで `std :: stack`要素を反復処理するにはどうすればいいですか?

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

私はトラブルstd::stackオブジェクトRegistersを反復を持っています。他のSTLコンテナとは異なり、イテレータまたはランダムアクセス演算子を提供しません。

どのようにループしてstd::stackオブジェクトにするのですか?

使用例:

RunningAverager ra(10); 

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

スタック全体を反復処理することはできません。それがスタックの全体のポイントです。 –

+0

@KerrekSBの理由から、 'std :: stack'の代わりに' boost :: circular_buffer'のようなものを使うべきだと思います。 – arne

答えて

0

あなたが最初のループでスタック上の値をプッシュします。したがって、2番目のループでそれらをポップアップして追加し、それらを数えて平均を得ることができます。

1

push_frontpop_frontを使用して、スタックの代わりにstd::dequeを使用できます。

1

この特定のアプリケーションにはstd::dequeコンテナを使用する方が簡単です。

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; 
}; 
関連する問題