2015-05-12 2 views
0

Предположим, что у меня есть контейнер, и мне нужно перемещаться по его элементам 1 на 1. Если я знаю, мне нужно использовать только оператор ++ на итераторе, я должен использовать ForwardIterator, но что я потеряю с точки зрения производительности, если вместо этого я использую BidirectionalIterator? Я не понимаю, как сообщить компилятору, что вы ограничиваете направление итератора в определенной области, может помочь сделать вашу программу лучше.Что делает использование ForwardIterator, в отличие от двунаправленногоИтератора, на аппаратном уровне?

+1

Прочтите созданный код ассемблера, который находится как можно ближе к оборудованию, которое вы сможете получить. Однако я не думаю, что это действительно то, что вам нужно, вместо этого я думаю, вы хотите знать, как компилятор может распознать итератор, который движется только в одном направлении, и ответ на это в основном состоит в том, что он имеет только оператор для этого направления , –

+0

Это больше относится к основным требованиям типа. Использование двунаправленного, когда это не требуется, может излишне требовать обратной итерации по типу, который его не реализует. –

+0

Это все о дизайне алгоритмов, а не эффективности. Если вы используете форвардный итератор, вы можете передать поток функции, но не если он двунаправлен. –

ответ

0

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

Перспективный итератор может быть только увеличен. Двунаправленный итератор поддерживает все, что делает итератор вперед, и может быть уменьшен. Итератор с произвольным доступом поддерживает все, что делает двунаправленный итератор, и может поддерживать арифметические операции, такие как указатель. Существует небольшая небольшая диаграмма here, которая показывает вам все, что поддерживает «тип».

Зная, что поддерживает эти типы, вы можете использовать эти типы в качестве параметров шаблона, чтобы выразить конечному пользователю, какой тип итератора вам нужен. Если функция вызывает итератор с произвольным доступом, вы не должны указывать ему форвардный итератор, потому что более вероятно, что они выполняют операции над итератором, которые не может сделать итератор вперед. И наоборот, если у вас есть функция, ожидающая форвардного итератора, и вы передаете ей итератор с произвольным доступом, тогда вы в порядке, так как итератор с произвольным доступом поддерживает всю операцию переднего итератора.

Смежные вопросы