2013-08-08 2 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 컨테이너와 달리 iterator 또는 임의 액세스 연산자를 제공하지 않습니다.

루프를 수행하고 std::stack 개체를 어떻게 처리합니까?

사용 예는 :

RunningAverager ra(10); 

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

스택을 반복 할 수 없습니다. 그것이 스택의 핵심입니다. –

+0

언급 한 @KerrekSB 이유로'std :: stack' 대신'boost :: circular_buffer'와 같은 것을 사용해야한다고 생각합니다. – arne

답변

0

첫 번째 루프에서 스택에 값을 밀어 넣습니다. 그래서 당신은 두 번째 루프에서 그들을 끄집어 낼 수 있고 평균을 얻기 위해 그들을 더할 수 있습니다.

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; 
}; 
관련 문제