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

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

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

16 ответов

25 просмотров

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

Помимо рекомендаций выше. Итератор - это класс, написанный на С++. Можно самому написать другой класс, который будет итератором. Класс является итератором тогда, когда наследуется от 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>, от которого в...

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

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

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

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

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

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

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

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

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

Господа, а что сейчас вообще с рынком труда на делфи происходит? Какова ситуация?
Rꙮman Yankꙮvsky
29
А вообще, что может смущать в самой Julia - бы сказал, что нет единого стандартного подхода по многим моментам, поэтому многое выглядит как "хаки" и произвол. Короче говоря, с...
Viktor G.
2
30500 за редактор? )
Владимир
47
а через ESC-код ?
Alexey Kulakov
29
Гайс, вопрос для разносторонее развитых: читаю стрим с юарта, нада выделять с него фреймы с определенной структурой, если ли чо готовое, или долбаться с ринг буффером? нада у...
Vitaly
9
Чёт не понял, я ж правильной функцией воспользовался чтобы вывести отладочную информацию? но что-то она не ловится
notme
18
У меня есть функция где происходит это: write_bit(buffer, 1); write_bit(buffer, 0); write_bit(buffer, 1); write_bit(buffer, 1); write_bit(buffer, 1); w...
~
14
Добрый день! Скажите пожалуйста, а какие программы вы бы рекомендовали написать для того, чтобы научиться управлять памятью? Можно написать динамический массив, можно связный ...
Филипп
7
Недавно Google Project Zero нашёл багу в SQLite с помощью LLM, о чём достаточно было шумно в определённых интернетах, которые сопровождались рассказами, что скоро всех "ибешни...
Alex Sherbakov
5
длина пакета фиксированная, или меняется?
Okhsunrog
7
Карта сайта