за 1 проход?
auto min_element = std::min_element(v.begin(), v.end());
auto first_positive = std::find_if (v.begin(), v.end(), [](int a) { return a > 0; });
auto latest_positive = std::find_if (v.begin(), v.end(), [](int a) { return a > 0; });
std::accumulate(v.begin(), v.end(), 0, [](int a, int b){return b > 0 ? a + b : a; });
ну в твоём коде можно просто убрать первые 3 строки
а если мне нужно находить эти значения и выводить
почему у тебя первый и последний позитив находятся абсолютно одинаокво?
std::partition
а, там должен был быть реверсный итератор
Можно, допустим, вот так: #include <iostream> #include <vector> #include <algorithm> #include <numeric> #include <iterator> int main() { std::vector<int> a { -1, 0, 3, 4, -5, 6, -7, 8, 9, -10, 0 }; int x = std::accumulate(find_if(a.begin(), a.end(), [](const int a) { return a > 0; }), std::next(a.begin(), std::distance(find_if(a.rbegin(), a.rend(), [](const int a) { return a > 0; }), a.rend())), 0); std::cout << x; } Правда, по-хорошему тут нужно ещё проверку сделать, типа: auto first = find_if(a.begin(), a.end(), [](const int a) { return a > 0; }); int x = 0; if (first != a.end()) { x = std::accumulate(first, std::next(...), 0); } Иначе всё рухнет, если положительных чисел нет.
вроде прям за 1 проход делается если найти 2 итератора на первый и последнийэ лемент и между ними пройти, в чем проблема?
а в чем проблема то?
ни в чем, так и надо
А, ну тут тоже за 1 проход и делается :)
Во, переделал немного :) #include <iostream> #include <vector> #include <algorithm> #include <numeric> #include <iterator> int main() { std::vector<int> a { -1, 0, 3, 4, -5, 6, -7, 8, 9, -10, 0 }; int x = 0; auto first = find_if(a.begin(), a.end(), [](const int a) { return a > 0; }); if (first != a.end()) { x = std::accumulate(first, find_if(a.rbegin(), a.rend(), [](const int a) { return a > 0; }).base(), 0); } std::cout << x; }
Обсуждают сегодня