Вход/Регистрация
Программирование. Принципы и практика использования C++ Исправленное издание
вернуться

Страуструп Бьерн

Шрифт:

vector<double>* jill_data = get_from_jill;

// ...обрабатываем...

delete[] jack_data;

delete jill_data;

}

Мы предполагаем, что эти данные хранятся в свободной памяти и их следует удалить после завершения обработки. Другое предположение заключается в том, что мы не можем переписать код, написанный Джеком и Джилл, или не хотим этого делать.

20.1.1. Работа с данными

Очевидно, что этот пример носит слишком упрощенный характер, но он похож на многие реальные задачи. Если мы сможем элегантно решить эту задачу, то сможем справиться с огромным множеством других задач программирования. В данной ситуации фундаментальная проблема заключается в том, что мы не можем повлиять на способ хранения данных, который выбрали поставщики. Наша задача состоит в том, чтобы либо работать с данными в том виде, в котором мы их получаем, либо считать их и записать в более удобной форме.

Что мы хотим делать с этими данными? Упорядочить их? Найти наибольшее значение? Вычислить среднее? Найти все значения, большие 65? Сравнить данные Джилл с данными Джека? Определить количество элементов? Возможности бесконечны. Когда мы пишем реальную программу, то просто выполняем требуемые вычисления. В данном случае мы хотим выяснить, как обработать данные и выполнить вычисления с большим массивом чисел. Сначала сделаем нечто совсем простое: найдем наибольший элемент в каждом из наборов данных. Для этого комментарий ...обработка... следует заменить соответствующими инструкциями.

// ...

double h = –1;

double* jack_high; // jack_high — указатель на наибольший элемент

double* jill_high; // jill_high — указатель на наибольший элемент

for (int i=0; i<jack_count; ++i)

if (h<jack_data[i])

jack_high = &jack_data [i]; // сохраняем адрес наибольшего

// элемента

h = –1;

for (int i=0; i< jill_data –>size; ++i)

if (h<(*jill_data)[i])

jill_high = &(*jill_data)[i]; // сохраняем адрес наибольшего

// элемента

cout << "Максимум Джилл: " << *jill_high

<< "; максимум Джека: " << *jack_high;

// ...

Обратите внимание на уродливую конструкцию, используемую для доступа к данным Джилл:

(*jill_data)[i]
. Функция
get_from_jill
возвращает указатель на вектор, а именно
vector<double>*
. Для того чтобы получить данные, мы сначала должны его разыменовать, получив доступ к вектору с помощью указателя
*jill_ data
, а затем применить к нему операцию индексирования. Однако выражение
*jill_data[i]
— не совсем то, что мы хотели; оно означает
*(jill_data[i])
, так как оператор
[]
имеет более высокий приоритет, чем
*
, поэтому нам необходимы скобки вокруг конструкции
*jill_data
, т.е. выражение
(*jill_data)[i]
.

ПОПРОБУЙТЕ

Как вы изменили бы интерфейс, чтобы избежать неуклюжих конструкций, если бы могли изменить код Джилл?

20.1.2. Обобщение кода

Нам нужен единообразный способ доступа и манипуляции данными, чтобы не переписывать программу каждый раз, когда представление данных немного изменяется. Посмотрим на коды Джека и Джилл и попробуем сделать их более абстрактными и единообразными.

Разумеется, все, что мы сделаем с данными Джека, относится и к данным Джилл. Однако между их программами есть два досадных различия: переменные

jack_count
и
jill_data–>size
, а также конструкции
jack_data[i]
и
(*jill_data)[i]
. Последнее различие можно устранить, введя ссылку.

vector<double>& v = *jill_data;

for (int i=0; i<v.size; ++i)

if (h<v[i])

{

jill_high = &v[i];

h = v[i];

}

Это очень похоже на код для обработки данных Джека. Может быть, стоит написать функцию, которая выполняла бы вычисления как с данными Джилл, так и с данными Джека? Возможны разные пути (см. упр. 3), но, стремясь к более высокой степени обобщения кода (см. следующие две главы), мы выбрали решение, основанное на указателях.

double* high(double* first, double* last)

  • Читать дальше
  • 1
  • ...
  • 305
  • 306
  • 307
  • 308
  • 309
  • 310
  • 311
  • 312
  • 313
  • 314
  • 315
  • ...

Ебукер (ebooker) – онлайн-библиотека на русском языке. Книги доступны онлайн, без утомительной регистрации. Огромный выбор и удобный дизайн, позволяющий читать без проблем. Добавляйте сайт в закладки! Все произведения загружаются пользователями: если считаете, что ваши авторские права нарушены – используйте форму обратной связи.

Полезные ссылки

  • Моя полка

Контакты

  • chitat.ebooker@gmail.com

Подпишитесь на рассылку: