Альтернативная версия find_if, который находит все, не просто первое?

Есть ли альтернативная версия std::find_if это возвращает итератор по всем найденным элементам вместо просто первого?

Пример:

bool IsOdd (int i) {
  return ((i % 2) == 1);
}

std::vector<int> v;
v.push_back(1);
v.push_back(2);
v.push_back(3);
v.push_back(4);

std::vector<int>::iterator it = find_if(v.begin(), v.end(), IsOdd);
for(; it != v.end(); ++it) {
  std::cout << "odd: " << *it << std::endl;
}
6
задан nlucaroni 1 March 2010 в 14:10
поделиться

2 ответа

Вы можете просто использовать цикл for :

for (std::vector<int>:iterator it = std::find_if(v.begin(), v.end(), IsOdd);
     it != v.end();
     it = std::find_if(++it, v.end(), IsOdd))
{
    // ...
}

В качестве альтернативы вы можете поместить свое условие и действие в функтор (выполнение действия, только если условие истинно) и просто использовать std :: foreach .

7
ответ дан 16 December 2019 в 21:38
поделиться

в STL нет, но boost предлагает такую ​​функциональность:

boost :: algorithm :: find_all

1
ответ дан 16 December 2019 в 21:38
поделиться
Другие вопросы по тегам:

Похожие вопросы: