Оба алгоритма вы используете возвращающие итераторы. Если вы разыменовываете итератор, вы получаете объект, «указываемый» этим итератором, поэтому вы печатаете значение , а не position при выполнении
cout << "min value at position " << *find(v2.begin(), v2.end(), value);
Итератор можно рассматривать как указатель (ну, не совсем, но, скажем так, для простоты); следовательно, один итератор не может дать вам позицию в контейнере. Поскольку вы перебираете вектор, вы можете использовать оператор минус, как сказал Конрад:
cout << "min value at " << min_element(v2.begin(), v2.end()) - v2.begin();
но я бы порекомендовал использовать алгоритм std :: distance, который намного более гибок и будет работать на всех стандартных контейнерах:
cout << "min value at " << distance(v2.begin(), min_element(v2.begin(), v2.end()));