입력 시퀀스 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);
}
스택을 반복 할 수 없습니다. 그것이 스택의 핵심입니다. –
언급 한 @KerrekSB 이유로'std :: stack' 대신'boost :: circular_buffer'와 같은 것을 사용해야한다고 생각합니다. – arne