私は入力シーケンスの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);
}
スタック全体を反復処理することはできません。それがスタックの全体のポイントです。 –
@KerrekSBの理由から、 'std :: stack'の代わりに' boost :: circular_buffer'のようなものを使うべきだと思います。 – arne