struct Data
{
Dept dept; // идентификатор цеха
Something something; // всякая ботва
double rate; // тот самый процент
};
container<Data> cont; // какой-то контейнер (вектор, список, всё что хошь)
// среднее по всем
struct add_rate
{
double operator()(double sum, const Data& data) const
{ return sum + data.rate; }
};
double avg = cont.empty() ? 0 : accumulate(cont.begin(), cont.end(), 0, add_rate()) / cont.size();
// среднее по каждому
struct statistics
{
double sum; int count;
statistics() : sum(0), count(0) {}
void operator +=(double rate) { sum += rate; ++count; }
double avg() const { return count ? sum/count : 0; }
};
map<Dept, statistics> rates;
struct add_rates
{
map<Dept, statistics> &rates;
add_rates(map<Dept, statistics>& r) : rates(r) {}
void operator()(const Data& data) const
{ rates[data.dept] += data.rate; }
};
for_each(cont.begin(), cont.end(), add_rates(rates));