Firstly, make it correct.
N is integral, you could make it E so you don't accidentally do integer arithmetic.
N-1 is wrong.
Rename average to mean.
Don't hardcode E.
You get:
template <typename It, typename E = typename std::iterator_traits<It>::value_type>
E std_dev(It begin, It end){
E N = std::distance(begin, end);
E const mean = std::accumulate(begin, end, E()) / N;
auto sum_term = [mean](E init, E value)-> E { return init + (value - mean)*(value - mean); };
E variance = std::accumulate(begin, end, E(), sum_term);
return std::sqrt(variance / N);
}
Slightly stylized:
template <typename It, typename E = typename std::iterator_traits<It>::value_type>
E std_dev(It b, It e)
{
E N = std::distance(b, e);
E const mean = std::accumulate(b, e, E{}) / N;
E variance = std::accumulate(b, e, E{}, [mean](E a, E v)-> E { return a + (v-mean)*(v-mean); });
return std::sqrt(variance / N);
}