Iterator end;
};
template <typename Iterator, typename Predicate>
static Range<Iterator> findRange(Iterator first, Iterator last, Predicate predicate)
{
bool firstFound = false;
Range<Iterator> scope { first, last };
for (Iterator iter = first; iter != last; ++iter)
{
auto predicateResult { predicate(*iter) };
if (predicateResult && !firstFound)
{
scope.begin = iter;
firstFound = true;
}
else if (!predicateResult && firstFound)
{
scope.end = iter;
break;
}
}
return scope;
}
Заранее извиняюсь за, возможно, глупый вопрос, но ничего похожего в <algorithm> нет? Грубо говоря, функции для нахождения диапазона значений в контейнере, для которых Predicate вернёт true
find_if?
Только для одного элемента же
в algorithm нету, я не видел
Ну в принципе непонятно как это реализовать. Вот содержимое контейнера: 1 5 2 7 3 6 9 Я хочу вернуть диапазон на все четные элементы. Но ведь этого сделать нельзя, потому что тут между четными есть нечетные, а "диапазон" - это "от сих до сих".
std::equal_range ?
Можно два раза вызвать
Ну это вы правильно заметили, у меня скорее вырожденный случай, когда в контейнере имеются значения, подчиняющиеся определённым закономерностям. Приведённая мной функция находит только первый диапазон, для поиска всех диапазонов надо что-то другое придумывать
А ассоциативные нельзя использовать?
Просто в неупорядоченном контейнере некорректно вести разговор о диапазоне..
Придется тогда свой алгоритм использовать. Но написать легко, std::find по первому элементу искомого ренжа, + std::equal начиная с него. В 5 строчек пишется
К сожалению, там довольно специфическая задача, придётся вдаваться в ненужные детали 😅
Как определить диапазон в неупорядоченном множестве?
как итератор на начало и конец внутри какого-то контейнера?)
Я имею ввиду математическую абстракцию) Диапазон - это последовательность от условно А, до В. Если данные не упорядочены, то что такое диапазон между А и В? Пример: В, Е, С, А, О, Т, В Или я что-то не так понял?
Не совсем понимаю, как тут прикрутить std::equal... Скорее надо находить итератор на первый элемент искомого ренжа через std::find_if, и начиная с этого итератора давать std::find_if_not. Или я перемудрил? 🧐
Если представить, что элементы В, Е, С в массиве В, Е, С, А, О, Т, В подчиняются определённым закономерностям, то тогда их можно представить как диапазон 😅
Ну если элементы в массиве подчиняются «каким-то» закономерностям, то он упорядоченный, поэтому и спросил, можете ли вы хранить его иначе)
https://github.com/joboccara/pipes?ysclid=lp12tjhe83831861037#take_while
Обсуждают сегодня