сбросить буст аккумулятор с ++ - PullRequest
0 голосов
/ 07 февраля 2019

Не найдя «ускоренного» способа сброса аккумулятора в C ++, я наткнулся на фрагмент кода, который, кажется, сбрасывает повышающий аккумулятор.Но не понимаю, как это достигается.Код такой, как показано ниже -

#include <iostream>
#include <boost/accumulators/accumulators.hpp>
#include <boost/accumulators/statistics/stats.hpp>
#include <boost/accumulators/statistics/mean.hpp>
using namespace boost::accumulators;

template< typename DEFAULT_INITIALIZABLE >
inline void clear( DEFAULT_INITIALIZABLE& object )
{
        object.DEFAULT_INITIALIZABLE::~DEFAULT_INITIALIZABLE() ;
        ::new ( boost::addressof(object) ) DEFAULT_INITIALIZABLE() ;
}

int main()
{
    // Define an accumulator set for calculating the mean 
    accumulator_set<double, stats<tag::mean> > acc;

    float tmp = 1.2;
    // push in some data ...
    acc(tmp);
    acc(2.3);
    acc(3.4);
    acc(4.5);

    // Display the results ...
    std::cout << "Mean:   " << mean(acc) << std::endl;
    // clear the accumulator
    clear(acc);
    std::cout << "Mean:   " << mean(acc) << std::endl;
    // push new elements again
    acc(1.2);
    acc(2.3);
    acc(3.4);
    acc(4.5);
    std::cout << "Mean:   " << mean(acc) << std::endl;

    return 0;
}

Что делают строки с 7 по 12?Как «очистить» удается сбросить аккумулятор?Кроме того, есть ли какой-то стандартный способ повышения, которого мне не хватает, и любые другие способы достижения того, что сделал приведенный выше код.

Ответы [ 2 ]

0 голосов
/ 07 февраля 2019

что делают строки с 7 по 12?

Они вызывают деструктор объекта, а затем создают по умолчанию новый объект (того же типа) в том же хранилище.

Для разумных типов это будет иметь тот же эффект, что и Ответ Максима , который назначает временное значение, созданное по умолчанию, существующему объекту.

Третий вариант -использовать отдельный объект

#include <iostream>
#include <boost/accumulators/accumulators.hpp>
#include <boost/accumulators/statistics/stats.hpp>
#include <boost/accumulators/statistics/mean.hpp>
using namespace boost::accumulators;

int main()
{
    {
        // Define an accumulator set for calculating the mean 
        accumulator_set<double, stats<tag::mean> > acc;

        float tmp = 1.2;
        // push in some data ...
        acc(tmp);
        acc(2.3);
        acc(3.4);
        acc(4.5);

        // Display the results ...
        std::cout << "Mean:   " << mean(acc) << std::endl;
    } // acc's lifetime ends here, afterward it doesn't exist

    {
        // Define another accumulator set for calculating the mean
        accumulator_set<double, stats<tag::mean> > acc;

        // Display an empty result
        std::cout << "Mean:   " << mean(acc) << std::endl;

        // push elements again
        acc(1.2);
        acc(2.3);
        acc(3.4);
        acc(4.5);
        std::cout << "Mean:   " << mean(acc) << std::endl;
    }

    return 0;
}
0 голосов
/ 07 февраля 2019

Чтобы повторно инициализировать объект, просто выполните:

acc = {};

То, что он делает, {} создает инициализированный по умолчанию временный объект, которому назначается acc.

...