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::stack
Registers
. 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);
}
Bạn không thể lặp qua một chồng. Đó là toàn bộ điểm của một chồng. –
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