хочу посоветоваться как лучше сделать
вот у меня есть такой код
while (endRay())
{
// перебираем точки на луче;
}
endRay() это либо сравнить с точкой, либо считать количество пройденных элементов, либо сравнивать значение на луче.
сперва думал что functor то что нужно. но как данные обновлять в лупе ?
спасибо!
Здравствуйте, Аноним, Вы писали:
А>хочу посоветоваться как лучше сделать А>вот у меня есть такой код А>
А>while (endRay())
А>{
А> // перебираем точки на луче;
А>}
А>
А>endRay() это либо сравнить с точкой, либо считать количество пройденных элементов, либо сравнивать значение на луче. А>сперва думал что functor то что нужно. но как данные обновлять в лупе ?
недостаточно входных данных
опиши задачу подробнее
Здравствуйте, Аноним, Вы писали:
J>>недостаточно входных данных J>>опиши задачу подробнее А>так наверное будет понятнее: вот тестовый код, который нагромоздил.
А>все работает, но что делать если вместо i хочется подставить значение double или что-то еще ? можно ли проще ?
А зачем тебе наследование в классе функтора, если не секрет?
Здравствуйте, Аноним, Вы писали:
А>endRay() это либо сравнить с точкой, либо считать количество пройденных элементов, либо сравнивать значение на луче. А>сперва думал что functor то что нужно. но как данные обновлять в лупе ? А>спасибо!
Наверное нечто подобное Java iterators — это то, что тебе нужно.
Что-то вроде:
class IndexIterator
{
private:
Point *points_;
int i_;
int end_;
int step_;
public:
IndexIterator(Point *p, int start, int end, int step): points_(p), i_(start), end_(end), step_(step) {}
bool hasNext { return i_ < end_; }
Point *getNext() { return points_[i_]; }
void moveForward() { i_ += step_; }
};
void foo()
{
Points *p;
IndexIterator i(p, 0, 10, 1);
while (i.hasNext())
{
Point *p = i.getNext();
// Do ....
i.moveForward();
}
}
J>>А зачем тебе наследование в классе функтора, если не секрет?
А>действительно, здесь не нужно. А>а что можно прикрутить, чтобы в качестве аргумента и double или что-нибудь еще можно было передавать. А>спасибо!
Этот вариант самый оптимальный по скорости, но если скорость не критична и издержки на виртуальный вызов приемлемы, то синтаксис можно еще больше упростить.
Здравствуйте, <Аноним>, Вы писали:
А>хочу посоветоваться как лучше сделать А>вот у меня есть такой код А>
А>while (endRay())
А>{
А> // перебираем точки на луче;
А>}
А>
А>endRay() это либо сравнить с точкой, либо считать количество пройденных элементов, либо сравнивать значение на луче.
Может быть, всё-таки это итератор
for(Some i=SomeBegin(); i!=SomeEnd(); ++i)
{
// *i - это текущая точка луча
}
что позволит использовать всевозможные алгоритмы — for_each, transform, find_if...
Тут есть два подхода:
1) Использовать "родные" итераторы коллекции точек и предварительно находить итератор конца подпоследовательности
Collection::iterator stop = // на выбор:
coll.end() // все
std::find(coll.begin(), coll.end(), value) // отсечка по значению
std::find_if(coll.begin(), coll.end(), predicate) // отсечка по условию
coll.begin() + n // заданное количество
for_each(coll.begin(), stop, visitor_func);
2) Использовать синтетические итераторы, которые разными способами знают, что такое "конец" (смотри boost/iterator)
Этот подход оправдан в том случае, если родные итераторы — всего лишь Input Iterator, и невозможно (либо дорого) неразрушающим способом получить итератор конца.
... << RSDN@Home 1.2.0 alpha rev. 655>>
Перекуём баги на фичи!
Re[2]: дизайн с обобщенной функцией
От:
Аноним
Дата:
11.10.07 11:36
Оценка:
да, похоже, что это лучшее решение. не оч силен писать итераторы — попробую разобраться.
спасибо!