Ваш код работает нормально.Когда я запустил его, я получил вывод:
The values in the file input.txt are:
1
2
3
4
5
6
7
8
9
10
The sum of the values is: 55
The mean value is: 5.5
Но это все еще можно улучшить.
Вы перебираете вектор, используя индексы.Это не «Путь STL» - вы должны использовать итераторы, чтобы:
typedef vector<double> doubles;
for( doubles::const_iterator it = v.begin(), it_end = v.end(); it != it_end; ++it )
{
total += *it;
mean = total / v.size();
}
Это лучше по ряду причин, обсуждаемых здесь и в других местах, но здесьдве основные причины:
- Каждый контейнер обеспечивает концепцию
iterator
.Не каждый контейнер обеспечивает произвольный доступ (например, индексированный доступ). - Вы можете обобщить свой код итерации.
Точка № 2 предлагает другой способ улучшить код.Еще одна вещь в вашем коде, которая не очень подходит для STL - это использование рукописного цикла.<algorithm>
были разработаны для этой цели, и лучший код - это код, который вы никогда не пишете.Вы можете использовать цикл для вычисления общего и среднего вектора, используя аккумулятор:
#include <numeric>
#include <functional>
struct my_totals : public std::binary_function<my_totals, double, my_totals>
{
my_totals() : total_(0), count_(0) {};
my_totals operator+(double v) const
{
my_totals ret = *this;
ret.total_ += v;
++ret.count_;
return ret;
}
double mean() const { return total_/count_; }
double total_;
unsigned count_;
};
... и затем:
my_totals ttls = std::accumulate(v.begin(), v.end(), my_totals());
cout << "The sum of the values is: " << ttls.total_ << endl;
cout << "The mean value is: " << ttls.mean() << endl;
РЕДАКТИРОВАТЬ:
Если вы пользуетесь компилятором, совместимым с C ++ 0x, это можно сделать еще проще, используя std::for_each
(в пределах #include <algorithm>
) и лямбда-выражение :
double total = 0;
for_each( v.begin(), v.end(), [&total](double v) { total += v; });
cout << "The sum of the values is: " << total << endl;
cout << "The mean value is: " << total/v.size() << endl;