在类

时间:2016-06-29 22:39:04

标签: c++ boost data-structures

我试图使用无序地图在类中保存滚动累加器。

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

#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二进制&#39; [&#39;:找不到运算符,它采用类型&#39; boost :: parameter :: keyword&#39;的右手操作数(或者没有可接受的转换)

感谢。

1 个答案:

答案 0 :(得分:2)

与@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