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

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

Шрифт:

// в массив
и возвращает количество

// элементов в переменной *count

vector<double>* get_from_jill; // Джилл заполняет вектор

void fct

{

int jack_count = 0;

double* jack_data = get_from_jack(&jack_count);

vector<double>* jill_data = get_from_jill;

double* jack_high = high(jack_data,jack_data+jack_count);

vector<double>& v = *jill_data;

double* jill_high = high(&v[0],&v[0]+v.size);

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

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

// ...

delete[] jack_data;

delete jill_data;

}

Здесь в двух вызовах функции

high
шаблонным типом аргумента является тип
double*
. Это ничем не отличается от нашего предыдущего решения. Точнее, выполняемые коды этих программ ничем не отличаются друг от друга, хотя степень общности этих кодов разнится существенно. Шаблонная версия функции
high
может применяться к любому виду последовательности, определенной парой итераторов. Прежде чем углубляться в принципы библиотеки STL и полезные стандартные алгоритмы, реализующие эти принципы, и для того чтобы избежать создания сложных кодов, рассмотрим несколько способов хранения коллекций данных.

ПОПРОБУЙТЕ

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

20.4. Связанные списки

Еще раз рассмотрим графическое представление последовательности.

Сравним его с визуализацией вектора, хранящегося в памяти.

По существу, индекс

0
означает тот же элемент, что и итератор
v.begin
, а функция
v.size
идентифицирует элемент, следующий за последним, который можно также указать с помощью итератора
v.end
.

Элементы в векторе располагаются в памяти последовательно. Понятие последовательности в библиотеки STL этого не требует. Это позволяет многим алгоритмам вставлять элементы между существующими элементами без их перемещения. Графическое представление абстрактного понятия последовательности предполагает возможность вставки (и удаления) элементов без перемещения остальных элементов. Понятие итераторов в библиотеки STL поддерживает эту концепцию.

Структуру данных, которая точнее всех соответствует диаграмме последовательности в библиотеке STL, называют связанным списком (linked list). Стрелки в абстрактной модели обычно реализуются как указатели. Элемент связанного списка — это часть узла, состоящего из элемента и одного или нескольких указателей. Связанный список, в котором узел содержит только один указатель (на следующий узел), называют односвязным списком (singly-linked list), а список, в которой узел ссылается как на предыдущий, так и на следующий узлы, — двусвязным списком (doubly-linked list). Мы схематично рассмотрим реализацию двухсвязных списков, которые в стандартной библиотеке языка С++ имеют имя

list
. Графически список можно изобразить следующим образом.

В виде кода он представляется так:

template<class Elem> struct Link {

Link* prev; // предыдущий узел

Link* succ; // следующий узел

Elem val; // значение

};

template<class Elem> struct list {

Link<Elem>* first;

Link<Elem>* last; // узел, находящийся за последним узлом

};

Схема класса

Link
приведена ниже.

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

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

20.4.1. Операции над списками

Какие операции необходимы для списка?

• Операции, эквивалентные операциям над векторами (создание, определение размера и т.д.), за исключением индексирования.

  • Читать дальше
  • 1
  • ...
  • 310
  • 311
  • 312
  • 313
  • 314
  • 315
  • 316
  • 317
  • 318
  • 319
  • 320
  • ...

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

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

  • Моя полка

Контакты

  • chitat.ebooker@gmail.com

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