2013-08-08 68 views
5

Tôi đang viết bộ lọc FIR có nghĩa vụ tính running average của chuỗi đầu vào.Làm cách nào để lặp lại các phần tử `std :: stack` trong vòng lặp for?

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

Tôi gặp sự cố khi lặp lại đối tượng std::stackRegisters. Không giống như các container STL khác, nó không cung cấp cho một toán tử truy cập vòng lặp hoặc truy cập ngẫu nhiên.

Làm cách nào để lặp và đối tượng std::stack?

Một cách sử dụng ví dụ:

RunningAverager ra(10); 

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

Bạn không thể lặp qua một chồng. Đó là toàn bộ điểm của một chồng. –

+0

Tôi nghĩ bạn nên sử dụng một cái gì đó như 'boost :: circular_buffer' thay vì' std :: stack' vì lý do @KerrekSB được đề cập. – arne

Trả lời

0

Bạn đẩy các giá trị trên stack trong vòng lặp đầu tiên. Vì vậy, bạn có thể bật chúng ra trong vòng lặp thứ hai và thêm chúng lên và đếm chúng để có được mức trung bình.

1

Bạn có thể sử dụng std::deque thay cho ngăn xếp, sử dụng push_frontpop_front.

1

Việc sử dụng vùng chứa std::deque dễ dàng hơn cho ứng dụng cụ thể này.

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; 
}; 
Các vấn đề liên quan