Russian Qt Forum
Май 23, 2024, 22:43 *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

Войти
 
  Начало   Форум  WIKI (Вики)FAQ Помощь Поиск Войти Регистрация  

Страниц: 1 2 [3]   Вниз
  Печать  
Автор Тема: Универсальный итератор  (Прочитано 21310 раз)
__Heaven__
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 2130



Просмотр профиля
« Ответ #30 : Ноябрь 10, 2015, 10:51 »

2) Для универсальности можно было бы сделать его Random Access итератором..
Не совсем понятно, что должно быть реализовано для
X a;
b = a; (ну, тут наверное, просто копировать все поля)
a == b
a != b
a < b
a > b
a <= b
a >= b
Также не понятно, как должны выполняться операции типа a += n. Операторами ++ приходить к результату получается?
Записан
m_ax
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 2094



Просмотр профиля
« Ответ #31 : Ноябрь 10, 2015, 12:47 »

Цитировать
Не совсем понятно, что должно быть реализовано для
Ну помимо перечисленного должно быть и operator+=(size_t n) и operator-=(size_t n).

Цитировать
Операторами ++ приходить к результату получается?
Нет, для тех контейнеров, которые random access использовать их средства, адя тех которые не поддерживают это, то да, остаётся ++)
Но это уже всё есть в стандартной библиотеке http://en.cppreference.com/w/cpp/iterator. В частности есть специализации таких функций как
advance
distance
next
prev
Они умеют работать и с C масивами и с обычными контейнерами.

Я не совсем понимаю, как вы ваш универсальный итератор будет работать с стандартными алгоритмами? Например с std::sort? 
Записан

Над водой луна двурога. Сяду выпью за Ван Гога. Хорошо, что кот не пьет, Он и так меня поймет..

Arch Linux Plasma 5
__Heaven__
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 2130



Просмотр профиля
« Ответ #32 : Ноябрь 10, 2015, 13:16 »

Под словом универсальность я больше подразумевал то, что этот шаблон позволяет пробежаться по элементам любого контейнера. А так да, его не применишь его к алгоритмам. С названием темы я всё-таки ошибся.
Про operator+=(size_t n) более менее понятно. Вроде как должно появиться в классе поле current_, которое будет смещаться.
Записан
__Heaven__
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 2130



Просмотр профиля
« Ответ #33 : Ноябрь 10, 2015, 13:36 »

Хотя, можно прикрутить методы begin(), end() и подавать в sort. Вроде
Записан
m_ax
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 2094



Просмотр профиля
« Ответ #34 : Ноябрь 10, 2015, 13:37 »

Цитировать
Под словом универсальность я больше подразумевал то, что этот шаблон позволяет пробежаться по элементам любого контейнера.
За исключением C массивов)

Цитировать
Вроде как должно появиться в классе поле current_, которое будет смещаться.
Нет, не надо никакого доп. поля, просто:
Код
C++ (Qt)
operator+=(size_t n)
{
    return std::advance(current_, n);
}
 
Причём, advance знает к какой категории (std::iterator_traits<decltype(begin_)>::iterator_category) относитчя begin_ и будет подсовывать свою соответствующую специализацию.

Кстатии, с вашим итератором std::iterator_traits работать не сможет.. Поэтому я и писал выше, что для stl совместимости лучше наследоваться от std::iterator.
« Последнее редактирование: Ноябрь 10, 2015, 13:58 от m_ax » Записан

Над водой луна двурога. Сяду выпью за Ван Гога. Хорошо, что кот не пьет, Он и так меня поймет..

Arch Linux Plasma 5
__Heaven__
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 2130



Просмотр профиля
« Ответ #35 : Ноябрь 10, 2015, 13:58 »

Спасибо. Посижу ещё почитаю  Улыбающийся
Записан
Страниц: 1 2 [3]   Вверх
  Печать  
 
Перейти в:  


Страница сгенерирована за 0.07 секунд. Запросов: 22.