![]() |
Модераторы: Daevaorn |
![]() ![]() ![]() |
|
exceilence |
|
|||
Новичок Профиль Группа: Участник Сообщений: 30 Регистрация: 22.6.2009 Где: Москва Репутация: нет Всего: нет |
Можно ли как-то применить паттерн итератор, дабы не писать этого двойного цикла везде при обходе шахматной доски? Кривость в том что мне нужны координаты! Шоб знать чётность и тп То есть чисто X.next и X.next_exist обойтись не выйдет Вот такие пироги. Или придётся хранить как свойства объекта текущие координаты? Это сообщение отредактировал(а) exceilence - 22.1.2010, 00:08 |
|||
|
||||
mes |
|
||||
любитель ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 7954 Регистрация: 14.1.2006 Репутация: 144 Всего: 250 |
можно так (псевдокод)
понадобится 1. структура точка, характериыующая координаты клетки 2. функция проверки на нахождение точки внутри поля 3. функция перемещения по каждой клетке клетке. или даже проще , обьединить пункты 2 и 3 , чтоб функция перемещения возвращала результат по окончанию итерации.
и функцию итерации можно будет сделать в нескольких вариантах (или многофункциональным функтором) для перемещения по горизонтали, вертикали и по всей доске. ![]() Это сообщение отредактировал(а) mes - 22.1.2010, 00:30 |
||||
|
|||||
mes |
|
|||
любитель ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 7954 Регистрация: 14.1.2006 Репутация: 144 Всего: 250 |
кстати тут не помешало бы написать две функции :
для проверки цвета поля |
|||
|
||||
Earnest |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Экс. модератор Сообщений: 5962 Регистрация: 17.6.2005 Где: Рязань Репутация: 53 Всего: 183 |
Можно. Посмотри boost::counting_iterator, это самый простой вариант, по-моему. Тебе потребуется определить способ индексирования ячеек доски в один индекс (хоть по строкам, хоть по столбцам, как удобно, в общем) + извлечение элемента по индексу. Но разыменовываться этот итератор будет в индекс, а не в точку (x,y). Хотя извлечь координаты строки-столбца отсюда не вопрос. Можно еще применить boost::iterator_adaptor и создать итератор с подходящей семантикой. -------------------- ... |
|||
|
||||
maxim1000 |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Участник Сообщений: 3334 Регистрация: 11.1.2003 Где: Киев Репутация: 17 Всего: 110 |
Я, обычно использую такой интерфейс:
всё описание последовательности, по которой происходит итерация сосредоточено в создании итератора, это гораздо удобнее, чем распределять её по всему for. ну а сам итератор содержит всю необходимую информацию, надо две координаты - буде выдавать две координаты кроме того, если захочется применять алгоритмы stl, может понадобиться делать begin/end, но честно говоря IsCompleted/GotoNext мне больше нравится, в крайнем случае обёртку написать... Это сообщение отредактировал(а) maxim1000 - 22.1.2010, 09:05 -------------------- qqq |
|||
|
||||
Earnest |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Экс. модератор Сообщений: 5962 Регистрация: 17.6.2005 Где: Рязань Репутация: 53 Всего: 183 |
Использование алгоритмов stl действительно очень удобно, особенно типа for_each. Но для этого совершенно недостаточно begin\end. Нужно, чтобы итератор был полноценным - удовлетворял всем требования концепции, а это означает кучу кода, в основном определений. Причем написать все это руками с первого раза вряд ли получится - много тонкостей. Именно поэтому я и говорю о iterator_adaptor, с помощью которого можно из любого класса с описанной maxim1000 функциональности сделать правильный итератор (с минимальными усилиями).
-------------------- ... |
|||
|
||||
![]() ![]() ![]() |
Правила форума "С++:Общие вопросы" | |
|
Добро пожаловать!
Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Earnest Daevaorn |
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей) | |
0 Пользователей: | |
« Предыдущая тема | C/C++: Общие вопросы | Следующая тема » |
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |