Хорошо, вот мой план для тех, кто любит использовать накопление, чтобы сделать его немного менее болезненным.Давайте создадим класс с именем StatsCollector.Мне все равно, что там на самом деле, за исключением того, что мы предположим, что это класс, который вы будете использовать в разных местах вашего кода, который собирает наборы чисел и предоставит вам информацию.Давайте свободно определим это.Я предполагаю, что он принимает удвоенные значения в качестве значений, но вы можете шаблонировать его для value_type.
class StatsCollector
{
public:
StatsCollector();
void add(double val);
// some stats you might want
size_t count() const;
double mean() const;
double variance() const;
double skewness() const;
double kurtosis() const;
};
Цель вышеизложенного состоит в том, чтобы вычислять статистические моменты из переданных данных. Этот класс предназначен для использованияа не просто взлом, чтобы вписаться в алгоритм, чтобы избежать использования циклов, и, надеюсь, вы можете использовать его много раз в вашем коде.
Теперь я напишу пользовательский функтор (вы могли бы использовать функцию) для нашего конкретногопетля.Я возьму указатель на один из вышеперечисленных.(Проблема со ссылкой заключается в том, что std :: аккумулировать присваивает ему, поэтому он будет копировать объект, который не является тем, что мы хотим. Это будет само-назначение, но самоопределение нашего указателя в значительной степени нет-op)
struct AddPairToStats
{
template< typename T >
StatsCollector * operator()( StatsCollector * stats, const T& value_type ) const
{
stats->add( value_type.second );
return stats;
}
};
Вышеописанное будет работать с любым типом карты независимо от типа ключа и с любым типом значения, который автоматически преобразуется в удвоение, даже если оно на самом деле не удваивается.
Теперь, предполагая, что у нас есть диапазон итераторов на нашей карте, мы можем использовать накопление следующим образом:
StatsCollector stats;
std::accumuluate( iterStart, iterEnd, &stats, AddPairToStats() );
И статистика будет готова для анализа.Обратите внимание, что вы можете настроить статистику для последующего использования в ее конструкторе, так что вы можете, например, установить флаги, чтобы не вычислять кубы / 4-ые степени, если вы не хотите, чтобы они вычисляли асимметрию и эксцесс (и даже не вычислять квадраты, если вы этого не сделаете).забота о дисперсии).