我对静态变量/双端队列和对象有疑问。我正在为实时数据流计算一些统计数据——均值、中值、偏斜等。因为这是流数据,所以我使用静态变量,或者在这个版本的静态容器(双端队列)中。我做了几个版本,它们都出现了同样的问题。即使我创建了同一个方法的两个实例,静态双端队列似乎是共享的。我有以下代码(不是最有效但可读的):
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);
我收到超出范围错误。
问题:
- 是什么导致了 out_of_range 异常?
- 我可能错了,但静态双端队列似乎在两个对象之间共享 - 这怎么可能?
感谢任何帮助!
最佳答案
关于 2:一个 static variable在 C 中,它的生命周期会在程序的生命周期内扩展。因此,当程序运行时,您的缓冲区变量只有一个实例。
在 1 上:因此在您的程序中:您首先使用 s1 对象构造一个大小为 20 的双端队列缓冲区,然后尝试使用 s2 对象将其用于大小为 30 的缓冲区。这会导致 20-29 范围内出现超出范围的错误,因为该变量是静态创建的。
在代码中使用静态变量通常不是一个好主意。
编辑:
您真正想要的是在您的 Stats 类中有一个 deque 成员变量。
class Stats {
private:
std::deque<double> buffer;
...
您在 Mean 函数中访问此变量(每个对象)。 (不要忘记在 Stats 的构造函数中初始化它)。
如果需要调整双端队列的大小,可以使用:
buffer.resize(length);
关于c++ - 静态变量/双端队列和对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26841124/