【问题标题】:Using rolling accumulators in unordered maps in a Class在类的无序映射中使用滚动累加器
【发布时间】:2016-06-29 22:39:04
【问题描述】:

我正在尝试使用无序映射来保存类中的滚动累加器。

首先让我展示一下什么是有效的。这是一个类中的累加器,它在没有地图的情况下按预期工作。注意累加器需要在初始化列表中进行初始化。

#include <iostream>
#include <boost/accumulators/accumulators.hpp>
#include <boost/accumulators/statistics/stats.hpp>
#include <boost/accumulators/statistics/rolling_mean.hpp>

namespace nmbstacc = boost::accumulators;
typedef nmbstacc::accumulator_set<double, nmbstacc::stats<nmbstacc::tag::rolling_mean >> MACC;

class RollMean {

public:
    MACC m_acc;
    RollMean(void) : m_acc(nmbstacc::tag::rolling_window::window_size = 3) {}
};

int main() 
{
    RollMean obj;
    obj.m_acc(0.5);
    obj.m_acc(1.5);
    obj.m_acc(2.5);
    obj.m_acc(3.5);

    std::cout << "roll_mean: " << nmbstacc::rolling_mean(obj.m_acc) << std::endl;

    std::getchar();
    return 0;
}

但是,我需要一个无序映射来将这些累加器保存在一个类中,但似乎无法弄清楚如何编译以下程序。我不确定如何在不首先初始化滚动累加器的情况下声明主地图容器。

#include <iostream>
#include <boost/accumulators/accumulators.hpp>
#include <boost/accumulators/statistics/stats.hpp>
#include <boost/accumulators/statistics/rolling_mean.hpp>
#include <unordered_map>

namespace nmbstacc = boost::accumulators;
typedef nmbstacc::accumulator_set<double, nmbstacc::stats<nmbstacc::tag::rolling_mean >> MACC;

class RollMean {

public:
    MACC m_acc;
    std::unordered_map<std::string, MACC> mainmap;
    RollMean(std::string name) : m_acc(nmbstacc::tag::rolling_window::window_size = 3) {
        mainmap.emplace(name, m_acc);
    }
};

int main() 
{
    RollMean obj("a");
    obj.mainmap["a"](1.0);

    std::cout << "roll_mean: " << nmbstacc::rolling_mean(obj.mainmap["a"]) << std::endl;

    std::getchar();
    return 0;
}

我收到以下错误:

错误 C2679 二进制“[”:未找到采用“boost::parameter::keyword”类型右侧操作数的运算符(或没有可接受的转换)

谢谢。

【问题讨论】:

  • 如果你写obj.mainmap["non_existing_key"]会发生什么?

标签: c++ boost data-structures


【解决方案1】:

就像@jv_ 暗示的那样,map[key] 是一个变异操作,如果不存在则插入一个默认构造元素。

但是,您的元素类型没有默认构造函数。因此,您不能使用该运算符。

如果您使用 obj.mainmap.at("a") 而不是 obj.mainmap["a"],则会在缺少键时出现异常。

Live On Coliru

#include <iostream>
#include <boost/accumulators/accumulators.hpp>
#include <boost/accumulators/statistics/stats.hpp>
#include <boost/accumulators/statistics/rolling_mean.hpp>
#include <unordered_map>

namespace nmbstacc = boost::accumulators;
typedef nmbstacc::accumulator_set<double, nmbstacc::stats<nmbstacc::tag::rolling_mean> > MACC;

class RollMean {

  public:
    MACC m_acc;
    std::unordered_map<std::string, MACC> mainmap;
    RollMean(std::string name) : m_acc(nmbstacc::tag::rolling_window::window_size = 3) { mainmap.emplace(name, m_acc); }
};

int main() {
    RollMean obj("a");
    obj.mainmap.at("a")(1.0);

    std::cout << "roll_mean: " << nmbstacc::rolling_mean(obj.mainmap.at("a")) << std::endl;
}

打印:

roll_mean: 1

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2022-06-10
    • 1970-01-01
    • 1970-01-01
    • 2010-12-14
    • 1970-01-01
    • 1970-01-01
    • 2022-01-12
    相关资源
    最近更新 更多