Menu
Coddy logo textTech

Обзор и философия 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 предоставляет проверенные временем оптимизированные реализации, что позволяет вам сосредоточиться на решении задач, а не на повторном создании стандартных структур данных.

challenge icon

Задание

Легко

Давайте создадим простую систему обработки данных, которая демонстрирует философию 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 работают вместе.

    Считайте пять входных значений (каждое на отдельной строке):

    1. Первое целое число
    2. Второе целое число
    3. Третье целое число
    4. Четвертое целое число
    5. Значение для поиска

    Создайте std::vector<int> и добавьте в него первые четыре целых числа. Затем продемонстрируйте философию STL, выполнив следующие действия:

    1. Вывод Original: с последующим вызовом printVector
    2. Вывод Sorted: с последующим вызовом sortAndPrint
    3. Вызов findElement с искомым значением
    4. Вывод 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;
}
quiz iconПроверьте себя

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

Все уроки раздела Объектно-ориентированное программирование