Поэтому общепринятым способом является передача контейнера по константной ссылке — это в любом случае гарантирует отсутствие накладных расходов на память и время.
Листинг 5.19. Функция-фильтр «умного» массива
typedef ТАггау::Uint uint;
ТАггау аггау(ТАггау source, double L, double R) { uint count = 0;
for(uint i = 0; i < source.size(); ++i)
if ((L<=source[i])&&(source[i]<=R)) ++count;
TArray result(count);
for(uint i = 0, j = 0; i < source.size(); ++i) if ((L<=source[i])&&(source[i]<=R)) { result[j]=source[i]; ++j; }
return result;
}
// для краткости
// количество элементов
// считаем
// массив-результат
// копируем
// возвращаем массив
Функция сначала считает количество элементов исходного массива, попадающих в заданный диапазон. Затем создается локальный массив требуемого размера и заполняется нужными значениями. Полученный массив возвращается в качестве результата.
Наш массив реализован только для элементов типа double, что является довольно жестким ограничением. В следующей главе мы поговорим о том, как создать более универсальную динамическую структуру.
Резюме
Память в С++ измеряется байтами. Операция sizeof (char) выдает результат, равный 1. Объекты С++ размещаются в трех видах памяти: статической, автоматической и динамической. Вид памяти фактически определяет и время жизни объекта. Для размещения одиночных объектов в динамической памяти используется операция new, для уничтожения — операция delete. Динамические массивы создаются операцией new[], уничтожаются операцией delete[]. При создании динамического массива количество элементов можно задать выражением, вычисляемым во время выполнения. Однако для многомерных динамических массивов разрешается задавать вычисляемое выражение только для самого левого измерения — остальные должны быть заданы константами. Размеры выделяемой динамической памяти зависят от реализации. |