В предыдущей главе мы реализовали функцию-фильтр для «умного» массива (см. листинг 5.19). Наша функция-фильтр дважды просматривает массив — это не слишком хорошо. Однако подобный режим работы является следствием того, что «умный» массив «не умеет» изменять свой размер. Если бы в нашем распоряжении был контейнер, к которому можно было бы присоединять элементы по мере необходимости, то функция выглядела бы так:
ТАггау array(TArray source, double L, double R)
{ TArray result: // массив-результат
for(uint i = 0; i < source.size(); ++i)
if ((L<=source[i])&&(source[i]<=R)) // если в диапазоне
result+=source[i]; // прицепляем элемент
return result; // возвращаем массив
}
Как видите, «способность» изменять размеры по мере необходимости может существенно повлиять на быстродействие — очевидно, что при большом исходном массиве эта функция будет работать в два раза быстрее, чем предыдущая.
Кроме того, наш «умный» массив представляет собой контейнер фиксированной длины, доступ к элементам которого осуществляется по индексу. Последовательный доступ реализуется в цикле последовательным изменением индекса. Чтобы разобраться, каким образом выполняется последовательный доступ с помощью итераторов, реализуем контейнер-дек с помощью двусвязного списка. Типом контейнера по сложившейся уже традиции пусть будет TDeque. Не задумываясь пока об общности, опять задействуем дробные числа типа double. |