У меня есть функция, которая получает выборку (std::vector<double>
) в качестве входных данных и вычисляет среднее значение выборки: как лучше всего обрабатывать случай с пустым входным вектором?
Моя первая идея — создать исключение, как в этом фрагменте:
double average(const std::vector<double>& sample)
{
size_t sz = sample.size();
if (sz==0) throw std::exception("unexpected empty vector");
double acc = 0;
for (size_t i=0; i<sz; ++i) acc += sample[i];
return acc/sz;
}
Но я думаю, что другим решением может быть возврат NaN:
double average(const std::vector<double>& sample)
{
size_t sz = sample.size();
if (sz==0) return std::numeric_limits<double>::quiet_NaN();
double acc = 0;
for (size_t i=0; i<sz; ++i) acc += sample[i];
return acc/sz;
}
Мне нравится исключение, потому что оно показывает, где возникла проблема, в то время как если я получу NaN в конечном результате долгого вычисления, мне будет сложнее понять, где родился NaN. Во всяком случае, с NaN мне нравится возможность вернуть «особый» двойной сигнал, чтобы сигнализировать о том, что произошло что-то неожиданное.
Есть ли другой способ справиться с пустым вектором? Спасибо.
std::accumulate( sample.begin(), sample.end(), 0.0 );
? - person Alessandro Jacopson   schedule 06.09.2011