Что такое istream_view и когда его использовать?

Судя по всему, в C++20 появилась новая конструкция, связанная с std::istream: std::istream_view. Страница cppreference на нем сейчас незавершена. Итак, что такое «вид istream» и для чего я могу его использовать?


† - Ok, technically it redirects to a page about std::basic_istream_view and that one's a stub.

Стоит ли изучать PHP в 2023-2024 годах?
Стоит ли изучать PHP в 2023-2024 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
4
0
771
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

std::istream_view<T> — это диапазон; и, более конкретно, диапазон, сформированный как представление. Это дополнение к стандартной библиотеке похоже на то, что вы можете найти в разделе std::ranges::views, за исключением того, что это не представление произвольного диапазона, а представление std::istream.

Итак, какой «просмотр» применяется к std::istream? Напомним, istream — это поток символов, а не произвольных элементов типа T по вашему выбору. Ленивое приложение для разбора этих символов на последовательные T — это «просмотр» istream. То есть k-й элемент std::istream_view<T>(is) — это то, что вы получите в k-е время работы is >> t для t типа T.

Вы должны использовать std::istream_view (осторожно), когда хотите применить свой код, который работает с диапазонами, непосредственно к входным данным - вместо того, чтобы сначала анализировать ввод в какую-либо структуру данных в более "старомодной" манере, а затем работая над этой структурой как над диапазоном.

Другие взгляды на то, что такое std::istream_view:

  • @Barry описал это как эквивалент сопрограммы, которая анализирует Ts из istream; прочитайте этот ответ для деталей (обратите внимание, что речь идет о представлении istream в диапазонах-v3, большая часть которых стала стандартной библиотекой диапазонов).
  • @NicolBolas считает, что это результат «оборачивания std::istream_iterator<T> в интерфейс представления C++20».

Так что это просто istream_iterator<T>, завернутый в интерфейс представления C++20.

Nicol Bolas 11.12.2020 23:44

@NicolBolas: Это действительно просто пара std::istream_iterator<T>(my_istream) и std::istream_iterator<T>()?

einpoklum 11.12.2020 23:47

Я сомневаюсь, что он использует именно эти типы, поскольку я не уверен, считаются ли они концептуальными итераторами. Но то, что вы описали, является основной идеей.

Nicol Bolas 11.12.2020 23:48

@Barry: я ошибочно предположил, что переключение типа элемента делает его непредставленным. Отредактировано.

einpoklum 11.12.2020 23:57

@NicolBolas Вы можете думать об этом так, но более эффективно. istream_iterator<T> должен иметь член T, что означает, что копирование этого итератора должно копировать T. Здесь istream_view<T> — это элемент с элементом T, а istream_view<T>::iterator — просто элемент istream_view<T>*, поэтому итераторы копировать дешевле.

Barry 11.12.2020 23:59

Однако мы не часто копируем итераторы.

Asteroids With Wings 12.12.2020 17:08

@AsteroidsWithWings, так что вы принимаете свои итераторы &? Почему? Я нахожу большинство (если не всех) людей, копирующих итераторы повсюду. Позвоните all_of, который делает что-то find_if, и у вас будет N ^ 2 копий. Вы не используете <algorithm>? Все эти вещи копируют итераторы.

Fureeish 12.12.2020 18:12

@Fureeish Я сказал никогда? Я сказал, что передаю итераторы по адресу? Нет... Давайте избегать ложных аргументов. Как часто вы делаете all_of с find_if внутри? Ваш типичный вариант использования похож на std::find(begin, end, val), и это пара копий. Не ничего, конечно, но действительно ли это масштабная сделка?

Asteroids With Wings 12.12.2020 22:19

@AsteroidsWithWings Я сказал никогда? Что останется, если не копировать их при прохождении? Сочетание all_of с find_if достаточно распространено, и люди, с которыми я работал (размер компании разный), упоминают об этом. «Пары копий» на вариант использования достаточно, чтобы считать «нечастое копирование итераторов» ошибкой. Не говоря уже о том, что весь общий код, который работает с итераторами, и делегаты работают с другими частями, где они снова копируются. Так что да, сделать итераторы настолько маленькими, насколько это возможно, очень сложно, просто потому, что это устоявшееся соглашение C++, согласно которому итераторы дешево копировать.

Fureeish 12.12.2020 22:32

@Fureeish А копировать char дешево. Вроде, очень. Я слышу много утверждений о том, что «это плохо», но никаких реальных данных или веских убедительных аргументов, почему это плохо. Бьюсь об заклад, вам потребовалось больше времени, чтобы написать свой последний комментарий, чем вы когда-либо сэкономили на копировании chars, хранящихся в istream_iterators.

Asteroids With Wings 12.12.2020 22:34

@AsteroidsWithWings проблема с абстрагированием концепции итераторов заключается в том, что все итераторы должны быть дешевыми для копирования. В этом случае следует позаботиться о том, чтобы они соответствовали этим требованиям. char копировать всегда дешево, так что вам не нужно спорить об этом. Когда вы сравниваете chars с iterators, вы говорите, что «chars очень дешево копировать». Большой. Если мы полагаемся на то, что char будут дешевыми для копирования, мы можем также полагаться на то, что все iterator будут дешевыми для копирования. Условная дешевизна копирования (независимо от того, содержит ли итератор char или string) лишила бы свободу оптимизации.

Fureeish 12.12.2020 22:45

@Fureeish Больше соломенных чучел! Никто не говорит о каком-то другом итераторе. Мы говорим об итераторах istream. Вот и все. Конец истории. Итак, это char или, может быть, wchar_t, которые могут состоять из четырех байтов. Вряд ли налогообложение для вашего компьютера. Вы по-прежнему не приводите здесь никаких доказательств реальной практической проблемы. Дело в том, что этот istream_view, насколько я вижу, не предлагает каких-либо существенных преимуществ в производительности, вопреки некоторым утверждениям выше. Если вы не согласны, не стесняйтесь предоставить некоторые практические доказательства!

Asteroids With Wings 12.12.2020 22:46

@AsteroidsWithWings эээ ... Я даю общее представление об удобстве использования итератора ... Не хранить переменную внутри итератора, очевидно, лучше для места, чем фактически хранить ее.

Fureeish 12.12.2020 22:56

@Fureeish В этом утверждении нет ничего «очевидного». Тем не менее, похоже, вы говорите о чем-то, не имеющем отношения к теме этого вопроса и ответа, так что давайте двигаться дальше.

Asteroids With Wings 12.12.2020 23:01

@AsteroidsWithWings: Не принимая здесь чью-либо сторону - разве итераторы istream не сохраняют значение T, а не char или wchar_t?

einpoklum 13.12.2020 00:05

@einpoklum О, это хороший момент - думаю, тогда я больше думал о istreambuf_iterator!

Asteroids With Wings 13.12.2020 00:37

Более того, это обсуждение должно привести к редактированию или рекомендации по редактированию? :-\

einpoklum 13.12.2020 22:39

Другие вопросы по теме