2016-08-26 9 views
-1

У меня есть это требование, чтобы найти последний элемент в векторе, который меньше значения.Найти последний элемент в std :: vector, который удовлетворяет условию

Как и find_first_of, но вместо первого я хочу последний. Я искал и обнаружил, что нет find_last_of, но есть find_first_of.

Почему это так? Является ли стандартный способ использовать find_first_of с помощью обратных итераторов?

+14

Да, использовать обратные итераторы. –

ответ

2

Вот как это делается с обратными итераторами:

std::vector<int> vec = {2,3,10,5,7,11,3,6}; 

//below outputs '3': 
std::cout << *(std::find_if(vec.rbegin(), vec.rend(), [](int i) { return i < 4; })); 
+0

Возможно, вы захотите проверить результат, прежде чем разыгрывать его в обычном коде. – Jarod42

+0

Конечно. Выше приведено только для иллюстративных целей. – Smeeheey

1

Использования reverse iterators, как это:

#include <iostream> 
#include <vector> 

int main() 
{ 
    std::vector<int> v{1,2,42,42,63}; 
    auto result = std::find_if(v.rbegin(), v.rend(), 
            [](int i) { return i == 42; }); 

    std::cout << std::distance(result, v.rend()) << '\n'; 
} 

Live demo.

+1

Последняя строка должна быть std :: cout << std :: distance (result, v.rend()) << '\ n'; –

+0

@Akshay, что приведет к отрицательному числу, я хочу расстояние до начала массива. – rubenvb

+0

Это не скомпилируется. Вы не можете сравнивать итератор и обратный итератор. – Evgeny

1

Просто одно. Будьте осторожны с предикатом, если вы хотите, чтобы найти хвост-конец диапазона, который включает в себя предикатное элемент:

int main() 
{ 
    std::vector<int> x { 0, 1, 2, 3, 4, 5 }; 

    // finds the reverse iterator pointing at '2' 
    // but using base() to convert back to a forward iterator 
    // also 'advances' the resulting forward iterator. 
    // in effect, inverting the sense of the predicate to 'v >= 3' 
    auto iter = std::find_if(std::make_reverse_iterator(x.end()), 
       std::make_reverse_iterator(x.begin()), 
       [](auto& v) { return v < 3; }).base(); 

    std::copy(iter, 
       x.end(), 
       std::ostream_iterator<int>(std::cout, ", ")); 
} 

результат:

3, 4, 5,