Re[11]: труд программера переоценен
От: Glоbus Украина  
Дата: 29.12.05 17:34
Оценка:
Здравствуйте, Glоbus, Вы писали:

G>Здравствуйте, Pzz, Вы писали:


Pzz>>Glоbus wrote:

>>>
>>> Pzz>Замечу только, что раз уж Вы пользуетесь итераторами, то знать размер
>>> Pzz>массива (вернее, в Вашем случае — не массива, а последовательности) Вам
>>> Pzz>не нужно. Что позволит Вашему алгоритму работать не только с массивами,
>>> Pzz>но и со списками, и вообще с любыми последовательностями.
>>>
>>> Я думаю, если бы вы таки-почитали то, что я написал, то увидели бы, что
>>> этот метод как раз и заточен так, чтобы работать с любой
>>> последовательностью, заданной двумя итераторами.

Pzz>>Длина-то последовательности Вам зачем? Содержательно она не нужна. Если

Pzz>>вам по каким-то причинам так кодировать _удобнее_, это Ваши сложности.
Pzz>>Вычисление длины, например, для односвязанного списка это не дешевая
Pzz>>операция. Или на таком уровне абстракции это уже считается неважным?

G>Так, это уже лучше То есть все-таки сошлись на том, что будет работать с любой последовательностью? Чудненько Да, насчет длинны тут можно и поспорить. Единственное предназначение — избежать инкремента итератора, указывающего на элемент за обрабатываемым в том случае, если обрабатываемый элемент — граничный. Тут возможно с вами, многоуважаемый и соглашусь — можно переписать и красивше.


И так — убираем ненужный расчет длины
— как оцените, драгоценнейший, такой вариант?
template<class TTPred,class TTIterator>
size_t countMaxes( TTIterator _start_it, TTIterator _end_it, const TTPred& _pred = TTPred() )
{
    size_t nCnt = 0;
    size_t nCurr = 0;
    TTIterator val_it = _start_it;
    TTIterator prev_it = val_it, next_it = val_it;
    TTIterator last_it = _end_it;
    if( _start_it != _end_it )
    {
        --last_it;
        ++next_it; 
    }//if
    while( val_it != _end_it )
    {
        if( (val_it == prev_it || _pred( *val_it, *prev_it )) &&
            (val_it == next_it || _pred( *val_it, *next_it )))
        {
            ++nCnt;
        }//if
        ++val_it;
        if( nCurr == 0 ) ++prev_it;
        if( val_it != last_it ) ++next_it;
        ++nCurr;
    }//while
    return nCnt;
}
Удачи тебе, браток!
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.