std::min_element is slow when there's a lot of data and it does not fit into the CPU cache: http://quick-bench.com/tlgxCx9CUMZgOfYbwhFaEI0WNOg
I guess the important difference is that std::min_element doesn't return the minimum value, but iterator for the minimum value. Finding the element with minimum value is more expensive than the value itself.
If you write: auto mins = *std::min_element(f.begin(), f.end()); so that you ask for the value, the benchmark now says the perf is exactly the same for the 2 versions. I would close this as invalid.
.