Здравствуйте, 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;
}