Это довольно похоже на сообщение от @mkaes, но идет еще дальше. Вместо использования std::transform
для создания вектора правильной длины, затем std::for_each
для создания строки правильной длины из каждого из них, это создает строку непосредственно из входных данных и записывает строки непосредственно из std::transform
:
#include <iostream>
#include <array>
#include <algorithm>
#include <string>
#include <iterator>
const int MAX_SPLATS = 40;
template <typename C>
void bar_chart(const C& values)
{
if (std::distance(values.begin(), values.end())<1)
return; // do some error handling
auto largest = *std::max_element(values.begin(), values.end());
std::transform(values.begin(), values.end(),
std::ostream_iterator<std::string>(std::cout, "\n"),
[=](double d) { return std::string((d/largest)*MAX_SPLATS, '*');} );
}
int main() {
std::array<double, 6> values = {22, 40, 28, 26, 14, 46};
bar_chart(values);
return 0;
}
Так как он все равно использует C ++ 11, я решил также использовать std::array
, так как он, кажется, хорошо подходит для текущей работы.