Эти виды задач носят универсальный характер. Естественно, мы хотим написать код, который решал бы эти задачи просто и эффективно. В то же время перед нами, как программистами, стоят следующие проблемы.
• Существует бесконечное множество вариантов типов данных (виды данных).
• Существует огромное количество способов организации коллекций данных.
• Существует громадное количество задач, которые мы хотели бы решить с помощью коллекций данных.
Для того чтобы минимизировать влияние этих проблем, мы хотели бы как можно больше обобщить наш код, чтобы он с одинаковым успехом мог работать с разными типами данных, учитывать разные способы их хранения и решать разные задачи, связанные с обработкой данных. Иначе говоря, мы хотим обобщить наш код, чтобы охватить все варианты. Мы действительно не хотим решать каждую задачу с нуля; это слишком утомительная потеря времени.
Для того чтобы понять, какая поддержка нам нужна, чтобы написать наш код, рассмотрим, что мы можем делать с данными, более абстрактно. Итак, можно сделать следующее.
• Собирать данные в контейнерах
• например, собирать их в объектах классов vector
, list
и массивах.
• Организовывать данные
• для печати;
• для быстрого доступа.
• Искать данные
• по индексу (например, найти 42-й элемент);
• по значению (например, найти первую запись, в которой в поле “age” записано число 7);
• по свойствам (например, все записи, в которых значение поля “temperature” больше 32 и меньше 100).
• Модифицировать контейнер
• добавлять данные;
• удалять данные;
• сортировать (в соответствии с каким-то критерием).
• Выполнять простые математические операции (например, умножить все элементы на 1,7).
Мы хотели бы делать все это, не утонув в море информации, касающейся отличий между контейнерами, способами доступа к элементам и их типами. Если нам это удастся, то мы сделаем рывок по направлению к своей цели и получим эффективный метод работы с большими объемами данных.
Оглядываясь назад на методы и инструменты программирования, описанные в предыдущих главах, мы видим, что уже можем писать программы, не зависящие от типа используемых данных. Этот вывод основан на следующих фактах.
• Использование типа int
мало отличается от использования типа double
.
• Использование типа vector
мало отличается от использования типа vector
.
• Использование массива чисел типа double
мало отличается от использования типа vector
.
• Поиск значения в объекте класса vector
не должен отличаться от поиска значения в массиве.
• Поиск объекта класса string
без учета регистра не должен отличаться от поиска объекта класса string
с учетом нижнего и верхнего регистров.
• Графическое изображение экспериментальных данных с точными значениями не должно отличаться от графического изображения экспериментальных данных с округленными значениями.
• Копирование файла не должно отличаться от копирования вектора.
Учитывая сказанное, мы хотим писать код, удовлетворяющий следующим условиям:
• его легко читать;
• легко модифицировать;
• он имеет систематический характер;
• он короткий;
• быстро работает.
• Единообразный доступ к данным:
• независимость от способа хранения данных;
• независимость от типа данных.
• Доступ к данным, безопасный с точки зрения типа:
• легкое перемещение по данным;
• компактное хранение данных.
• Скорость работы:
• поиск данных;
• добавление данных;
• удаление данных.
• Стандартные версии большинства широко распространенных алгоритмов таких как copy
, find
, search
, sort
, sum
, ...
Библиотека STL обеспечивает не только эти возможности. Мы изучим эту библиотеку не только потому, что она представляет собой очень полезный набор инструментов, но и потому, что является примером максимальной гибкости и эффективности. Библиотека STL была разработана Алексом Степановым (Alex Stepanov) для того, чтобы создать базу для универсальных, правильных и эффективных алгоритмов, работающих с разнообразными структурами данных. Ее целью были простота, универсальность и элегантность математики.