Обзор и философия STL
Часть раздела Объектно-ориентированное программирование путешествия по C++ на Coddy — урок 70 из 104.
Стандартная библиотека шаблонов (STL) — это коллекция шаблонных классов и функций, предоставляющих общие структуры данных и алгоритмы. Основанная на изученных вами концепциях шаблонов, STL воплощает в себе мощную философию проектирования: отделение хранения данных от манипулирования ими.
STL организована вокруг трех основных компонентов, которые работают вместе:
| Компонент | Назначение | Примеры |
|---|---|---|
| Контейнеры | Хранят коллекции объектов | vector, map, set |
| Итераторы | Обеспечивают доступ к элементам контейнера | Ввода, вывода, произвольного доступа |
| Алгоритмы | Выполняют операции над данными | sort, find, transform |
Ключевая идея заключается в том, что алгоритмы не знают о контейнерах напрямую — они работают через итераторы. Это означает, что один и тот же алгоритм sort работает с векторами, массивами и любым контейнером, который предоставляет подходящий тип итератора:
#include <vector>
#include <algorithm>
#include <iostream>
int main() {
std::vector<int> nums = {5, 2, 8, 1, 9};
std::sort(nums.begin(), nums.end());
for (int n : nums) {
std::cout << n << " ";
}
// Вывод: 1 2 5 8 9
}Это разделение означает, что вы можете комбинировать и сочетать — использовать любой алгоритм с любым совместимым контейнером без написания нового кода. STL предоставляет проверенные временем оптимизированные реализации, что позволяет вам сосредоточиться на решении задач, а не на повторном создании стандартных структур данных.
Задание
ЛегкоДавайте создадим простую систему обработки данных, которая демонстрирует философию STL по разделению контейнеров, итераторов и алгоритмов. Вы создадите вспомогательный модуль, работающий с компонентами STL, и основную программу, показывающую, как эти части взаимодействуют друг с другом.
Вы создадите два файла:
DataProcessor.h: Определите вспомогательные функции, которые работают с контейнерами STL через итераторы, демонстрируя философию дизайна STL.Создайте функцию с именем
printVector, которая принимаетstd::vector<int>&и выводит все элементы, разделенные пробелами, за которыми следует символ новой строки. Используйте итераторы (begin()иend()) для обхода контейнера.Создайте функцию с именем
sortAndPrint, которая принимаетstd::vector<int>&, сортирует его с помощьюstd::sort, а затем выводит отсортированные элементы, разделенные пробелами, за которыми следует символ новой строки.Создайте функцию с именем
findElement, которая принимаетstd::vector<int>&и значениеintдля поиска. Используйтеstd::findдля поиска элемента. Если элемент найден, выведитеFound: <value>. Если не найден, выведитеNot found: <value>.Создайте функцию с именем
getSum, которая принимаетstd::vector<int>&и возвращает сумму всех элементов. Для этого можно использовать простой цикл с итераторами.main.cpp: Считайте входные данные и продемонстрируйте, как компоненты STL работают вместе.Считайте пять входных значений (каждое на отдельной строке):
- Первое целое число
- Второе целое число
- Третье целое число
- Четвертое целое число
- Значение для поиска
Создайте
std::vector<int>и добавьте в него первые четыре целых числа. Затем продемонстрируйте философию STL, выполнив следующие действия:- Вывод
Original:с последующим вызовомprintVector - Вывод
Sorted:с последующим вызовомsortAndPrint - Вызов
findElementс искомым значением - Вывод
Sum: <result>с использованиемgetSum
Например, при входных данных 5, 2, 8, 1 и 8:
Original: 5 2 8 1
Sorted: 1 2 5 8
Found: 8
Sum: 16При входных данных 10, 30, 20, 40 и 15:
Original: 10 30 20 40
Sorted: 10 20 30 40
Not found: 15
Sum: 100Обратите внимание, как ваши функции работают с вектором через итераторы, и как std::sort и std::find оперируют любым контейнером, предоставляющим подходящий тип итератора. В этом заключается мощь дизайна STL — алгоритмы отделены от контейнеров и связаны только через итераторы.
Шпаргалка
Стандартная библиотека шаблонов (STL) — это набор шаблонных классов и функций, предоставляющих общие структуры данных и алгоритмы. Она отделяет хранение данных от манипулирования ими.
STL состоит из трех основных компонентов:
| Компонент | Назначение | Примеры |
|---|---|---|
| Контейнеры | Хранят коллекции объектов | vector, map, set |
| Итераторы | Обеспечивают доступ к элементам контейнера | Входные, выходные, произвольного доступа |
| Алгоритмы | Выполняют операции над данными | sort, find, transform |
Алгоритмы работают через итераторы, а не напрямую с контейнерами. Это позволяет одному и тому же алгоритму работать с любым совместимым контейнером:
#include <vector>
#include <algorithm>
#include <iostream>
int main() {
std::vector<int> nums = {5, 2, 8, 1, 9};
// Сортировка с использованием итераторов
std::sort(nums.begin(), nums.end());
// Обход с использованием итераторов
for (int n : nums) {
std::cout << n << " ";
}
// Вывод: 1 2 5 8 9
}Общие методы итераторов:
begin()— возвращает итератор на первый элементend()— возвращает итератор на позицию после последнего элемента
Общие алгоритмы STL:
std::sort(begin, end)— сортирует элементы в диапазонеstd::find(begin, end, value)— ищет значение в диапазоне
Попробуйте сами
#include <iostream>
#include <vector>
#include "DataProcessor.h"
using namespace std;
int main() {
// Прочитать пять целых чисел из ввода
int num1, num2, num3, num4, searchValue;
cin >> num1;
cin >> num2;
cin >> num3;
cin >> num4;
cin >> searchValue;
// TODO: Создайте vector и добавьте в него первые четыре целых числа
// TODO: Выведите "Original: " и вызовите printVector
// TODO: Выведите "Sorted: " и вызовите sortAndPrint
// TODO: Вызовите findElement с искомым значением
// TODO: Выведите "Sum: ", а затем результат getSum
return 0;
}
В этом уроке есть небольшой тест. Начните урок, чтобы ответить на вопросы и сохранить прогресс.
Все уроки раздела Объектно-ориентированное программирование
1Основы ООП
Внешние файлыСборка и компиляция C++Заголовочные файлы и файлы исходного кодаПространства имен и область видимостиВведение в ООП на C++Классы и объектыУказатель 'this'Методы (функции-члены)Атрибуты (члены данных)Основы конструкторов и деструкторовИтоги — Простой калькулятор4Свойства классов
Члены экземпляра против статическихГеттеры и сеттерыКонстантные функции-членыКлючевое слово mutableСтатические методы и переменныеДружественные функции и классыИтоги — Менеджер банковских счетов7Наследование
Основы наследованияУровни доступа при наследованииПорядок вызова конструкторов и деструкторовПереопределение методовВиртуальные функции и VTableМножественное наследованиеВиртуальное наследованиеИтоги — Иерархия сотрудников10Обзор STL
Обзор и философия STLКонтейнеры STLИтераторыАлгоритмы STLФункторы и лямбда-выраженияИтоги: частота слов13Паттерны проектирования. Часть 1
Введение в паттерны проектированияПаттерн SingletonFactory и Abstract FactoryПаттерн BuilderПаттерн ObserverПаттерн Strategy2Управление памятью
Стек и кучаУказатели и ссылкиДинамическая память (new/delete)Умные указатели в C++RAII в C++Итоги — Менеджер динамического массива5Инкапсуляция
Спецификаторы доступа в C++Спецификаторы доступа: подробный разборСокрытие данныхStruct против ClassВложенные и внутренние классыИтоги — Система учета студентов8Полиморфизм
Полиморфизм компиляции и времени выполненияПерегрузка функцийВиртуальные функции: повторениеЧистые виртуальные функцииАбстрактные классыПроектирование интерфейсов на C++Dynamic Casting и RTTIИтоги: Калькулятор фигур11Продвинутые концепции ООП
Композиция против наследованияМиксины через CRTPИдиома PimplСтирание типовEnum Classes и строгая типизацияОбработка исключений в ООППользовательские иерархии исключений14Паттерны проектирования. Часть 2
Паттерн КомандаПаттерн АдаптерПаттерн ДекораторПаттерн Шаблонный методПаттерн СостояниеПаттерн КомпоновщикRAII как паттерн3Конструкторы и деструкторы
Конструктор по умолчаниюПараметризованный конструкторКонструктор копированияКонструктор перемещенияСписки инициализации конструктораДелегирующие конструкторыГлубокое погружение в деструкторыПравило трех / пяти / нуляПовторение — класс String6Перегрузка операторов
Введение в перегрузку операторовПерегрузка арифметических операторовПерегрузка операторов сравненияОператоры потоковПерегрузка оператора присваиванияПерегрузка операторов [] и ()Операторы преобразования типовИтоги — класс Matrix9Шаблоны
Шаблоны функцийШаблоны классовСпециализация шаблоновВариативные шаблоныОсновы SFINAE и Type TraitsИтоги — Обобщенный контейнер