静态变量/双端队列和对象

时间:2014-11-10 10:04:01

标签: c++ static outofrangeexception

我遇到静态变量/双端队列和对象的问题。我正在计算实时数据流的一些统计数据 - 均值,中位数,偏斜等。由于这是流数据,我使用静态变量,或者在此版本中使用静态容器(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);

我超出了范围错误。

问题:

  1. 导致out_of_range异常的原因是什么?
  2. 我可能错了,但似乎静态双端队列在两个对象之间共享 - 这怎么可能?
  3. 任何帮助表示赞赏!

1 个答案:

答案 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);