Подтвердить что ты не робот

Итераторы С++ считаются вредными?

На сегодняшней конференции библиотеки Boost Андрей Александреску, автор книги Modern С++ Design и библиотеки Loki С++, дал интервью под названием "Итераторы должны идти" (видео, слайды) о том, почему итераторы плохие, и у него было лучшее решение.

Я попытался прочитать слайды презентации, но я не мог получить от них много.

  • Являются ли итераторы плохими?
  • Является ли его замена действительно лучше?
  • Реализуют ли разработчики С++ свои идеи?
4b9b3361

Ответ 1

Во-первых, чтобы ответить на ваши вопросы:

  • Нет. Фактически, я утверждал в других местах, что итераторы - это самая важная/фундаментальная концепция компьютерной науки. Я (в отличие от Андрея) также считаю, что итераторы интуитивно понятны.
  • Да, определенно, но это не должно быть сюрпризом.
  • Хм. Глядя на Boost.Range и С++ 0x - не так ли?

Андрей большой вклад здесь просто сказать: вообще отказаться от концепции итераторов, см. диапазоны не только как удобная обертка, но как основная конструкция. Другие языки уже сделали это (многие концепции Андрея просто эхо .NET LINQ или итераторы Python), но все они предлагают только диапазоны вывода. Андрей рассуждает о разных типах диапазонов, как и обычные категории итераторов.

В этом свете странно, что он начинает с издевательств над произволом этих категорий итераторов.

Я также думаю, что его примеры отключены, особенно его копирование файлов: да, вариант итератора - это огромное улучшение по сравнению с кодом 1975 года. Он уменьшает цикл со сложным условием прерывания до одного оператора. То, что он действительно беспокоит здесь, - это просто синтаксис. Ну, извините меня: мы говорим о С++ здесь - конечно, синтаксис уродлив. И да, использование диапазонов здесь - это улучшение, но только синтаксически.

Я также считаю, что реализация Andrei find отключена. То, что он на самом деле определяет, есть операция DropUntil (именование сложно!) Из LINQ. Операция find должна действительно возвращать один или нулевой элемент (или итератор!). Отказ от итераторов здесь не помогает, на мой взгляд, так как мы можем захотеть изменить значение напрямую, а не копировать его. Возвращение одноэлементного диапазона здесь только добавляет накладные расходы без выгоды. Выполнение этого пути Андрея плохо, потому что тогда имя метода просто неверно и вводит в заблуждение.

Тем не менее, я практически согласен с Андреем практически во всех вопросах. Итераторы, будучи моей концепцией для домашних животных из компьютерных наук, безусловно, представляют собой большую синтаксическую нагрузку, и многие диапазоны (особенно бесконечные генераторы) могут (и должны) быть реализованы без них.

Ответ 2

  • Большинство из нас просто используют их в том, что стало хорошо известными идиомами, например, для циклов, чтобы пройти через std::vector. Разработчик читает его и знает, что происходит. В нашей повседневной жизни кодирования, итераторы не являются хорошими или плохими, они просто "то, что выполняет свою работу".
  • Возможно, да.
  • Я так не думаю.

Ответ 3

Андрей иногда может быть немного провокационным. Итераторы являются разумной концепцией и довольно фундаментальны в том смысле, что биты. Но так же, как большинство бит на С++ - это не bools, а часть более крупных типов, большинство итераторов следует решать на высоком уровне. Андрей прав, что правильный уровень для этого - объект диапазона. Но не все диапазоны правильно отображаются как диапазоны итераторов, как показывает показания istream_iterator. Это просто взломать искусственный конечный итератор. Однако я не думаю, что его идеи будут подхвачены реализацией. С++ 1x будет иметь значение как C99.

Ответ 4

Я согласен с ним в том, что итераторы в основном уступают диапазонам, и я не знаю, получит ли "что-то лучшее".

"Хорошее - это враг лучших", здесь сильно играет, как это обычно бывает. Итераторы полезны и прочно укоренились, поэтому трудно понять, может ли что-то лучше, чем диапазоны, вытеснить их за разумные промежутки времени.

Ответ 5

С++ 0x уже делает первые шаги:

  • Ссылки rvalue решают некоторые проблемы с обработкой контейнеров в диапазонах В базовую библиотеку добавлены диапазоны
  • включая понятия диапазона

Переход к диапазонам без потери какой-либо функциональности итератора (подумайте обо всех комбинациях категорий итераторов, констант и rvalue-ness) сложно, особенно если вы пытаетесь повлиять на бесконечные и изменяемые диапазоны.

Ответ 6

  • Нет, они неплохие, на самом деле это очень умная идея. Однако они не идеальны, и есть возможность улучшить концепцию итератора.

  • Он решает множество проблем с итераторами в реальной жизни. Например, утомительно (также подвержено ошибкам) ​​во многих случаях запрашивать два отдельных объекта, итераторы, из одного контейнера, а затем передавать их как еще два отдельных объекта в алгоритм. Почему бы не пройти вокруг одного объекта? Даже std::pair<iterator, iterator> сделает для грубого диапазона, который легче манипулировать - один объект, а не два. Кроме того, рекомендуется рассмотреть a range is an iterator. Это на самом деле то, что предлагает Андрей. Кстати, некоторые из этих проблем уже решены Boost.Range.

  • Я бы ожидал, что это произойдет, но это будет не революция, а эволюция.

Ответ 7

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

Ответ 8

Разве Андрей не пытается сделать какой-то скрытый маркетинг для языка D (в настоящее время он работает с ним)...?

Андрей утверждает, что контейнеры в порядке, но итераторы уродливы, не интуитивно понятны, подвержены ошибкам и опасны, их трудно реализовать (ну, похоже, это последнее похоже на правду...) И что у нас есть на С++... указатели? Разве они не уродливые/.../опасны? Но мы счастливо обняли их и жили с ними.

Какой из них более интуитивно понятен:

for(auto i=foo.begin();i!=foo.end();++i)
    bar(*i);

или

for (auto r=foo.all(); !foo.empty(); foo.popFront())
        bar(r.front());

Концепция итераторов может быть дополнена диапазонами и другими идеями, но я думаю, что они имеют свое место и не будут заменены.

Ответ 9

  • Иногда
  • Возможно,
  • Не похоже, по крайней мере, не на многие годы.

Ответ 10

Как и любой API или функция, если неправильное использование может затруднить многие проблемы идентификации. Итераторы использовались во многих проектах, но всегда сохраняли необходимый уход в соответствии с их характеристиками. Его использованию должно предшествовать хорошее понимание их ограничений. Итераторы могут быть очень полезны, если пользователь правильно.
Эти вопросы связаны:
Есть ли способ проверить, действительно ли итератор? Должен ли я предпочитаю итераторы над const_iterators?

Ответ 11

Я не согласен с Андреем и Конрадом и с самим собой: -)

Самая фундаментальная концепция - это интерфейс, а не итератор, и это довольно очевидно в любой работе, которую сегодня делает кто-то (что касается кросс-библиотеки, кросс-языка, кросс-компилятора, кросс-OS, кросс-платформенного, вы переименовать его:-)

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

В этой степени IEnumerable и IQueryable делают половину "правильной" TM, но они явно уступают своим понятиям итерации и намного больше того, что вы можете делать с STL, сохраняете контроль и так далее и так далее (но otoh, они имеют лучшие метаданные и, следовательно, лучшую, более чистую модель). Точка с интерфейсами позволяет создавать любую абстракцию, которую вы хотите и удовлетворяете, но, вероятно, противоречивое, но по сути безмозгло: оптимальное и временное или нейтральное представление данных и кода времени компиляции (особенно важно для алгоритмов и компиляторов и виртуальных машин, а что нет),

Можно даже оптимизировать его для "динамических" /компонентных систем вплоть до "runtime" inline (винт HotSpot VM:-).. В этой степени прогресс до 1975 года минимален, как видно из огромной рабочей нагрузки в interop (это везде, где вы смотрите, в том числе этот сайт, его использование проприетарных и открытых технологий и т.д., в идеализме информатики, этот тип взаимодействия "работа" не должен существовать, если он).

Ответ 12

Я думаю, что разработчики С++ получат полную поддержку полной поддержки С++ 0x без реализации новых, нестандартных парадигм.

Ответ 13

Единственным аргументом, который я могу видеть из этого представления, является невозможность определить диапазоны, а предложение С++ 0x "Диапазон для утверждения", похоже, в какой-то мере устраняет эту проблему. возможно, это не должно быть аргументом в отношении того, следует ли итераторам использовать/не использовать вообще, но более того, в каких ситуациях они должны/не должны использоваться?