после некоторой боли мне удалось взломать вместе этот минимальный пример повышающего filter_iteratorЗачем нужен фильтр filter_iterator, имеет странную функцию make_filter_iterator?
using namespace std;
std::function<bool(uint32_t)> stlfunc= [](uint32_t n){return n%3==0;};
int main()
{
vector<uint32_t> numbers{11,22,33,44,55,66,77,3,6,9};
auto start = boost::make_filter_iterator(stlfunc, numbers.begin(), numbers.end());
auto end = boost::make_filter_iterator(stlfunc, numbers.end() , numbers.end());
auto elem = std::max_element(start,end);
cout << *elem;
}
Это работает хорошо, но мне интересно, почему make_filter_iterator принимает numbers.end()
? я мог бы неправильно использовать его таким образом, я guestimated это на примере массива C:
http://www.boost.org/doc/libs/1_53_0/libs/iterator/example/filter_iterator_example.cpp
Он также объясняет, что это необязательно, если базовый итератор по умолчанию является конструктивным (и представляет собой конец диапазона, который вы хотите). –
im confused ... нормальные итераторы не знают, когда остановиться, так зачем делать filter_iterator? Я имею в виду, что вы не делаете этого (auto it = v.begin; it! = Std :: vector :: iterator(); ++ it) –
NoSenseEtAl
@NoSenseEtAl Не нужно ли UB увеличивать итератор 'end'? –