Указатель или класс как итератор? - PullRequest
4 голосов
/ 18 июня 2011

Я пишу контейнер произвольного доступа на C ++. В моем коде я использую это (ну, в моем реальном коде я использую всевозможные определения типов Allocator, это просто легче понять):

template<typename T, typename Allocator = std::allocator<T> >
class Carray {
public:
    // ...
    typedef T* iterator;
    typedef const T* const_iterator;
    // ...
};

Но я также могу создать другой класс итераторов, полученный из std::iterator. Это добавит поддержку typedefs (it::iterator_category, it::difference_type и т. Д.).

Теперь мой вопрос, есть ли издержки при использовании класса итератора вместо необработанного указателя? Если да, насколько значительны эти издержки и достаточно ли они серьезны, чтобы не использовать класс итераторов?

Ответы [ 2 ]

2 голосов
/ 18 июня 2011

Если ваш класс итератора просто оборачивает указатель, это почти наверняка не приводит к накладным расходам.

Совершенно соответствует стандартам использование необработанных указателей в качестве итераторов.Однако некоторый плохо написанный код (включая, как вы предлагаете, код, который пытается использовать вложенные typedefs напрямую вместо iterator_traits) может не скомпилироваться.Некоторые из ранних стандартных библиотек начинались с указателей для итераторов вектора и изменялись просто для того, чтобы такой плохой код работал.Это действительно единственная причина, по которой я думаю о том, что надоело.

Кстати: если возможно, я бы использовал поддержку Boost iterator, а не производную напрямую от std :: iterator;Таким образом, о вас заботятся многие тонкие требования.

2 голосов
/ 18 июня 2011

У вас есть категория итератора, тип разницы и т. Д. Avalaibale, даже если у вас есть необработанный указатель.Видите ли, есть этот шаблон iterator_traits<>, который вы должны использовать.Он уже специализирован для указателей.

iterator_traits<int*>::value_type // ... etc. 
//or
iterator traits<my_custom_iterator>::value_type
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...