Мне было интересно, есть ли какой-либо встроенный или хорошо установленный способ (то есть через лямбда), чтобы пройти через элементы std :: list и найти все те, которые соответствуют данное значение? Я знаю, что могу перебирать все из них, но я подумал, что спрошу, есть ли способ получить итератор, который выполняет только те элементы, которые соответствуют заданным критериям? Мой пример ниже дает мне только итератор для первого элемента соответствия.Найти все совпадающие элементы в std :: list
#include <list>
#include <algorithm>
#include <stdio.h>
int main()
{
std::list<int> List;
List.push_back(100);
List.push_back(200);
List.push_back(300);
List.push_back(100);
int findValue = 100;
auto it = std::find_if(List.begin(), List.end(), [findValue](const int value)
{
return (value == findValue);
});
if (it != List.end())
{
for (; it != List.end(); ++it)
{
printf("%d\n", * it);
}
}
return 0;
}
Благодарим за любую отзыв.
Неоднократно вызывайте 'find_if', чтобы найти оставшиеся совпадения, просто увеличивайте начальный итератор до каждого вызова (при условии, что последний вызов привел к совпадению). Если вы делаете это достаточно часто, напишите функцию. И если все, что вы делаете, использует 'operator ==' внутри предиката, нет необходимости в 'find_if',' find' делает это для вас. – Praetorian
* «если есть способ получить итератор, который выполняет итерации только с элементами, которые соответствуют заданным критериям». Возможно, [Итераторы фильтра] (http://www.boost.org/doc/libs/1_57_0/libs/iterator/ док/filter_iterator.html)? – dyp