#Headers and namespaces
We don't use <sstring>; thatany string-stream, so #include <sstream> line can be removed.
We should pass the vector by reference to a const object, as we don't want to make a copy or to modify the value.
Instead of returning zero when there are no members, perhaps we should return a NaN value (which is more consistent with arithmetic 0.0 / 0):
if (numbers.empty())
return std::numeric_limits<double>::quiet_NaN();
double computeSampleVariance(const double mean, const std::vector<int>& numbers)
{
if (numbers.size() <= 1u)
return 0;std::numeric_limits<double>::quiet_NaN();
auto add_square = [mean](double sum, int i)
{
auto d = i - mean;
return sum + d*d;
};
double total = std::accumulate(numbers.begin(), numbers.end(), 0.0, add_square);
return total / (numbers.size() - 1);
}
#include <algorithm>
#include <cmath>
#include <fstream>
#include <iostream>
#include <iterator>
#include <limits>
#include <numeric>
#include <vector>
std::vector<int> readFile(const std::string& filePath)
{
std::ifstream in_file(filePath);
std::istream_iterator<int> start{in_file}, end;
std::vector<int> numbers;
std::copy(start, end, std::back_inserter(numbers));
return numbers;
}
double computeMean(const std::vector<int>& numbers)
{
if (numbers.empty())
return 0;std::numeric_limits<double>::quiet_NaN();
return std::accumulate(numbers.begin(), numbers.end(), 0.0) / numbers.size();
}
double computeSampleVariance(const double mean, const std::vector<int>& numbers)
{
if (numbers.size() <= 1u)
return 0;std::numeric_limits<double>::quiet_NaN();
auto const add_square = [mean](double sum, int i) {
auto d = i - mean;
return sum + d*d;
};
double total = std::accumulate(numbers.begin(), numbers.end(), 0.0, add_square);
return total / (numbers.size() - 1);
}
int main()
{
#ifdef TEST
const std::vector<int> numbers = { -2, -1, 1, 2, 100000-2, 100000-1, 100000+1, 100000+2};
#else
std::cout << "Please enter the file path :" << std::endl;
std::string filePath;
std::cin >> filePath;
const std::vector<int> numbers = readFile(filePath);
#endif
double mean = computeMean(numbers);
double variance = computeSampleVariance(mean, numbers);
double standardDeviation = std::sqrt(variance);
std::cout << numbers.size() << " numbers : ";
auto separator = "";
for (int number: numbers) {
std::cout << separator << number;
separator = ", ";
}
std::cout << std::endl;
std::cout << "Mean : " << std::to_string(mean)
<< "Variance : " << std::to_string(variance)
<< "Standard Deviation : " << std::to_string(standardDeviation) << std::endl;
return 0;
}