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

标签 c++ static outofrangeexception

我对静态变量/双端队列和对象有疑问。我正在为实时数据流计算一些统计数据——均值、中值、偏斜等。因为这是流数据,所以我使用静态变量,或者在这个版本的静态容器(双端队列)中。我做了几个版本,它们都出现了同样的问题。即使我创建了同一个方法的两个实例,静态双端队列似乎是共享的。我有以下代码(不是最有效但可读的):

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. 我可能错了,但静态双端队列似乎在两个对象之间共享 - 这怎么可能?

感谢任何帮助!

最佳答案

关于 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/

相关文章:

Java:for循环只能执行一次

java - 这个匿名类对象什么时候被创建和访问,什么时候被垃圾回收?

magento - 当我尝试删除产品时,Magento中出现错误

java - Java中的数组增广问题

c++ - SetDisplayMode(XRes, YRes, 16 对 32, 0, 0)

c++ - 多次从 ifstream 读取

c# - 静态构造函数和单例类

c++ - PCL:使用 RANSAC 访问 pcl::ModelCoefficients::Ptr 的字段以进行线模型近似

c++ - 从类本身运行函数

postgresql - 如何在 View 中捕获 'bigint out of range' 错误?