Menu
Coddy logo textTech

Обзор и философия STL

Часть раздела Объектно-ориентированное программирование путешествия по C++ на Coddy. Урок 70 из 104.

Standard Template Library (STL) — это набор основанных на шаблонах классов и функций, предоставляющих распространённые структуры данных и алгоритмы. Построенная на изученных вами концепциях шаблонов, STL воплощает мощную философию проектирования: отделять хранение данных от обработки данных.

STL организован вокруг трёх основных компонентов, которые работают вместе:

КомпонентНазначениеПримеры
КонтейнерыХранят коллекции объектовvector, map, set
ИтераторыПредоставляют доступ к элементам контейнераввода, вывода, произвольного доступа
АлгоритмыВыполняют операции над даннымиsort, find, transform

Ключевая идея заключается в том, что алгоритмы не знают о container напрямую — они работают через iterators. Это означает, что один алгоритм sort работает с векторами, массивами и любым container, который предоставляет подходящий тип iterators:

#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: Define служебные функции, работающие с контейнерами 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. First целое число
    2. Second целое число
    3. Third целое число
    4. Fourth целое число
    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: алгоритмы отделены от контейнеров и связаны с ними только через итераторы.

Попробуйте сами

#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: Создать вектор и добавить в него первые четыре целых числа
    
    // TODO: Вывести "Original: " и вызвать printVector
    
    // TODO: Вывести "Sorted: " и вызвать sortAndPrint
    
    // TODO: Вызвать findElement с искомым значением
    
    // TODO: Вывести "Sum: " и затем результат getSum
    
    return 0;
}
quiz iconПроверьте себя

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

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

Потренируйтесь самостоятельно: Онлайн-компилятор C++