#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 да, действительно. Именно это я и хотел сказать.