Можно ли создать «внешний» класс итератора (т. е.: без доступа к исходному типу данных)

#c #iterator #mfc

#c #итератор #мфц

Вопрос:

Я работаю над проектом, в котором было бы полезно создать тип итератора для класса MFC CArray .

Поскольку CArray это часть библиотек MFC, у меня нет доступа к этому объекту.

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

Можно ли создать итератор «внешний» для класса. т. е.: Внешний по отношению к CArray классу.

Комментарии:

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

2. CArray должно быть довольно просто обернуть итератор: все, что вам нужно, — это ссылка на исходный CArray объект и текущий индекс для итератора.

Ответ №1:

CArray представляет собой непрерывный контейнер. Таким образом, простой указатель является итератором произвольного доступа для этого контейнера:

 templatelt;class ...Tsgt; auto begin(CArraylt;Ts...gt;amp; arr) noexcept { return amp;arr[0]; }  templatelt;class ...Tgt; auto begin(CArraylt;Ts...gt; constamp; arr) noexcept { return amp;arr[0]; }  templatelt;class ...Tgt; auto end(CArraylt;Ts...gt;amp; arr) noexcept { return begin(arr)   arr.GetSize(); }  templatelt;class ...Tgt; auto end(CArraylt;Ts...gt; constamp; arr) noexcept { return begin(arr)   arr.GetSize(); }  

Комментарии:

1. Итак, как бы вы повторили между begin / end ?

2. @AndrewTruckle, как и любой другой итератор. Это итераторы с произвольным доступом.

3. @AyxanHaqverdili: Это возвращает указатели. Указатели являются итераторами для непрерывных массивов. Это намеренно — определение итераторов является обобщением указателей.

4. @MSalters да, действительно. Именно это я и хотел сказать.