Предположим, что у меня есть контейнер, и мне нужно перемещаться по его элементам 1 на 1. Если я знаю, мне нужно использовать только оператор ++
на итераторе, я должен использовать ForwardIterator
, но что я потеряю с точки зрения производительности, если вместо этого я использую BidirectionalIterator
? Я не понимаю, как сообщить компилятору, что вы ограничиваете направление итератора в определенной области, может помочь сделать вашу программу лучше.Что делает использование ForwardIterator, в отличие от двунаправленногоИтератора, на аппаратном уровне?
ответ
Тип итератора описывает, какие операции вы можете использовать на нем. Сам итератор представляет собой просто концепцию описания указателя типа, который используется для взаимодействия со стандартными контейнерами.
Перспективный итератор может быть только увеличен. Двунаправленный итератор поддерживает все, что делает итератор вперед, и может быть уменьшен. Итератор с произвольным доступом поддерживает все, что делает двунаправленный итератор, и может поддерживать арифметические операции, такие как указатель. Существует небольшая небольшая диаграмма here, которая показывает вам все, что поддерживает «тип».
Зная, что поддерживает эти типы, вы можете использовать эти типы в качестве параметров шаблона, чтобы выразить конечному пользователю, какой тип итератора вам нужен. Если функция вызывает итератор с произвольным доступом, вы не должны указывать ему форвардный итератор, потому что более вероятно, что они выполняют операции над итератором, которые не может сделать итератор вперед. И наоборот, если у вас есть функция, ожидающая форвардного итератора, и вы передаете ей итератор с произвольным доступом, тогда вы в порядке, так как итератор с произвольным доступом поддерживает всю операцию переднего итератора.
- 1. Защита от вирусов на аппаратном уровне
- 2. Hyper threading на аппаратном уровне
- 3. Что происходит на аппаратном уровне при доступе к элементу массива?
- 4. Как выполняются сдвиги на аппаратном уровне?
- 5. Что делает flash.discard? В чем отличие от flash.clear()?
- 6. Что делает кастинг на уровне компилятора/машины?
- 7. Что такое пример C++ forwarditerator?
- 8. На базовом уровне, что делает eval-parse в R?
- 9. Действительно ли строки python неизменяемы на аппаратном уровне?
- 10. Как работает беспроводной сетевой адаптер на аппаратном уровне и возможностях?
- 11. VHDL имитирует штраф, но не действует на аппаратном уровне
- 12. Как установить GPIO NanoPi как выход на аппаратном уровне?
- 13. Сопроцессор Intel Xeon Phi поддерживает графическую обработку на аппаратном уровне?
- 14. Использование notdir в ссылке на замещение в отличие от patsubst
- 15. Что происходит в «петле цикла» на аппаратном уровне? Автоматически назначается ли память? (C++)
- 16. В отличие от array_chunk
- 17. Что делает этот код точно на уровне оборудования или выше?
- 18. Использование интерфейсов на сервисном уровне
- 19. Что делает использование в C#?
- 20. выбрать отличие от elasticsearch
- 21. Использование патч издеваться функции (в отличие от метода)
- 22. В отличие от события, похожего на edge.create
- 23. Хранение на JVM в отличие от сеанса
- 24. Использование функции Close() с WPF в отличие от использования Close()
- 25. Join В отличие от таблиц
- 26. В отличие от Linux Split
- 27. Отличие от одной колонки
- 28. Вроде/В отличие от кнопки
- 29. Использование сеансов Django для каждого представления, в отличие от пользователя
- 30. Использование setlocale на уровне объекта или на уровне приложения
Прочтите созданный код ассемблера, который находится как можно ближе к оборудованию, которое вы сможете получить. Однако я не думаю, что это действительно то, что вам нужно, вместо этого я думаю, вы хотите знать, как компилятор может распознать итератор, который движется только в одном направлении, и ответ на это в основном состоит в том, что он имеет только оператор для этого направления , –
Это больше относится к основным требованиям типа. Использование двунаправленного, когда это не требуется, может излишне требовать обратной итерации по типу, который его не реализует. –
Это все о дизайне алгоритмов, а не эффективности. Если вы используете форвардный итератор, вы можете передать поток функции, но не если он двунаправлен. –