170 похожих чатов

Скажите, можно ли в С++ настраивать итераторы? Допустим, я хочу

чтоб мне отдался итератор, который хавает какую нибудь функцию или параметр, в которой закодировано его поведение? Допустим, я хочу, чтоб итератор при инкрементации контейнера с числами смотрел, если там лежит число 666, то он автоматом бы перескакивал на следующий элемент, то есть мне как клиенту данных итератора, отдавались бы уже как бы фильтрованные итератором данные.

16 ответов

9 просмотров

https://en.cppreference.com/w/cpp/ranges

Гражданин Котейко
https://en.cppreference.com/w/cpp/ranges

накрайняк https://github.com/ericniebler/range-v3

Помимо рекомендаций выше. Итератор - это класс, написанный на С++. Можно самому написать другой класс, который будет итератором. Класс является итератором тогда, когда наследуется от iterator_traits, там пять элементов в traits. В таком классе можно реализовать любое поведение, конечно.

The Pressbraker- Автор вопроса
Andrey Solovyev
Помимо рекомендаций выше. Итератор - это класс, на...

А ну ты прав, в принципе! Можно самому проверять, что отдавать в своем итераторе.

Andrey Solovyev
Помимо рекомендаций выше. Итератор - это класс, на...

вот от iterator_traits наследоваться не надо, надо выбрать какая из категорий/концептов итераторов интересует и выполнить её требования в своём классе см. - https://en.cppreference.com/w/cpp/iterator - https://en.cppreference.com/w/cpp/header/iterator также может быть полезным: https://www.boost.org/doc/libs/1_83_0/doc/html/boost_stlinterfaces/tutorial___iterator_interface_.html

Гражданин Котейко
вот от iterator_traits наследоваться не надо, надо...

Все-таки traits должны быть в любом типе-итераторе. template <typename I> concept Iterator = requires() { typename I::value_type; typename I::difference_type; typename I::reference; typename I::pointer; typename I::iterator_category; }; А так да, поведение зависит от категории, ну и от фантазии разработчика.

Andrey Solovyev
Все-таки traits должны быть в любом типе-итераторе...

Оберните код в теги: 3 символа ` до и после кода (в случае одиночной конструкции достаточно 1 ` с обеих сторон). Спасибо!

The Pressbraker- Автор вопроса
Andrey Solovyev
Помимо рекомендаций выше. Итератор - это класс, на...

Погоди. А мне значит надо делать фасад для контейнера сначала. Иначе как я подружу свой итератор со стандартным контейнером? Мне получается надо как бы свой класс-контейнер делать со своим итератором, который будет фильтровать то, что ему будет приносить родной итератор стандартного вектора... Или же просто делать прокси итератор, просто принимать итератор и смотреть сначала что в нем, если не то, то делать ++

Andrey Solovyev
Все-таки traits должны быть в любом типе-итераторе...

однако шаблон iterator_traits<Iter>, от которого вы посоветовали наследоваться предназначен не для того чтобы от него наследоваться, а для того, чтобы передать туда тип итератора и получить из него эти тайп алиасы вы как минимум попутали с наследованием от https://en.cppreference.com/w/cpp/iterator/iterator

Если тебе надо иметь свой итератор от контейнера STL (что очень сомнительное архитектурное решение), то я вижу два пути: - сделать свой класс, который наследуется от контейнера STL и переопределить методы на возврат своего итератора - сделать прокси-итератор, как ты пишешь, принимать в него результат итератора контейнера Но это все выглядит как надевать штаны через голову. Чего-то слишком сложно, надо поискать решение попроще.

Andrey Solovyev
Если тебе надо иметь свой итератор от контейнера S...

от контейнеров STL нельзя наследоваться публично т.к. они не содержат вирт деструктора

Гражданин Котейко
однако шаблон iterator_traits<Iter>, от которого в...

Пассивная агрессия - это повод задуматься о личном состоянии. Что-то где-то болит, видимо.

клюквенный сбитень
от контейнеров STL нельзя наследоваться публично т...

А кто-то собрался удалять создаваемый объект по указателю на родителя? Где об этом шла речь?

Andrey Solovyev
А кто-то собрался удалять создаваемый объект по ук...

полиморфизм работает через ссылку либо указатель

The Pressbraker
Погоди. А мне значит надо делать фасад для контей...

Просто напишите итератор который создаётся от итератора. Реализуйте в нем свою логику и все. Но по данному условию вам нельзя делать категорию выше input. Такие итераторы уже есть в boost можно взять там.

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

Обсуждают сегодня

а зачем этот вопрос для удаления из чата?
Mёdkinson Medvezhkin
63
TCodePointer = record cp: CodePointer; name: string; cnt: Integer; next: TCodePointerArray; // этот тип ещё неизвестен end; TCodePointerArray = array of ...
notme
9
Привет ) есть такой кусок кода, он считывает ini файл. my $conf = Config::IniFiles->new( -file => $ini_file ); if (!$conf) { $self->my_die('cannot_read_cfg', ...
Kolya lastname
7
Добрый день. Хочу сделать отрисовку по команде на панели. Почему-то рисуется только при втором вызове. С чем может быть связано, не подскажете? procedure TForm1.FormDblClick(...
Kirill Filippenok
20
Всем привет! Подскажите. Я написал приложение на Delphi 10.2 Tokyo под Windows 10. И передо мной стал вопрос о том чтобы сделать это приложение кроссплатформенным (под Linux и...
Дмитрий Завгородний
24
Блин, интересно, кто-нибудь когда-нибудь переписывал какую-нибудь игру с x86 на arm? Вообще, такое возможно?
Alan 🔝 Бэброу
13
why html and css is not standard? i mean why different browser has their own engine and styles and how them work to show result to end user?
Mr Thieves
10
Эх кто-то пришел и весь праздник испортил :( You need complex FBX scene importing setup to change things on import? good luck with that. You need navigation and pathfinding? g...
Serg Gini
5
Всем привет! Нужен совет от опытных. Переношу свой проект с Делфи 10.2 Токио на Лазарус 3.2 установленный через инсталлятор fpcupdeluxe-x86_64-win64. При импортировании проект...
Дмитрий Завгородний
7
Всем доброго дня! Подскажите может кто использовал связку Pagebuilder + Clientsetting. Сами параметры с типом pagebuilder в модуле Clientsetting работают нормально, можно такж...
Александр Добриков
12
Карта сайта