我遇到静态变量/双端队列和对象的问题。我正在计算实时数据流的一些统计数据 - 均值,中位数,偏斜等。由于这是流数据,我使用静态变量,或者在此版本中使用静态容器(deque)。我已经制作了几个版本,它们都表现出同样的问题。即使我使用相同方法的两个实例,静态双端队列似乎是共享的。我有以下代码(不是最有效但可读的):
double Mean(double& lastValue, const int& length)
{
static std::deque<double> buffer(length);
double sum = 0.0;
buffer.pop_back();
buffer.push_front(lastValue);
for (int j = 0; j < length; j++) {
try {
sum += buffer.at(j);
}
catch (const std::out_of_range& oor) {
std::cerr << "Out of Range error: " << j << " - " << oor.what() << '\n';
}
}
return length != 0 ? sum / length : 0;
}
如果我做两个这样的实例:
Stats s1, s2;
s1.Mean(streamData, 20);
s2.Mean(streamData, 30);
我超出了范围错误。
问题:
任何帮助表示赞赏!
答案 0 :(得分:1)
on 2:C中的static variable具有在程序生命周期内扩展的生命周期。因此,程序运行时只有一个缓冲区变量实例。
on 1:所以在你的程序中:首先使用s1对象构造一个大小为20的deque缓冲区,然后尝试使用s2对象将其用于30的大小。这会导致20-29范围内的超出范围错误,因为变量是静态创建的变量。
在代码中使用静态变量通常不是一个好主意。
编辑:
你真正想要的是在你的Stats类中有一个deque成员变量。
class Stats {
private:
std::deque<double> buffer;
...
您可以在Mean函数中访问此变量(每个对象)。 (不要忘记在Stats的构造函数中初始化它。)
如果您需要调整双端队列的大小,可以使用:
buffer.resize(length);