Современный C++ и альтернативы на C

Контейнеры и алгоритмы STL в C++

В этом уроке вы сравните циклы, написанные вручную для обработки массива на C, с комбинацией готовых алгоритмов стандартной библиотеки C++.

Введение

Стандартная библиотека C++ (STL) предоставляет контейнеры вроде vector и множество готовых алгоритмов для фильтрации, суммирования и сортировки. Эти алгоритмы работают с диапазоном итераторов, что отделяет обработку от способа хранения данных.

Главное

  • Поймите, как это делается в C, прежде чем изучать абстракции C++.
  • Выражайте владение ресурсами через RAII и семантику значений (value semantics).
  • Используйте типобезопасные средства C++ вместо макросов и приведений типов.

Примеры кода на C и C++

C
Запустить →
main.c
#include <stdio.h>

int main(void) {
    int values[] = {3, 8, 2, 7, 6};
    int even[5];
    int count = 0;
    int sum = 0;
    for (int index = 0; index < 5; ++index) {
        if (values[index] % 2 == 0) {
            even[count++] = values[index];
        }
    }
    for (int index = 0; index < count; ++index) {
        sum += even[index];
    }
    printf("count=%d sum=%d\n", count, sum);
}
Результат выполнения
count=3 sum=16
C++
Запустить →
main.cpp
#include <algorithm>
#include <iostream>
#include <iterator>
#include <numeric>
#include <vector>

int main() {
    std::vector values{3, 8, 2, 7, 6};
    std::vector<int> even;
    std::copy_if(values.begin(), values.end(),
                 std::back_inserter(even),
                 [](int value) { return value % 2 == 0; });
    std::cout << "count=" << even.size()
              << " sum="
              << std::accumulate(even.begin(), even.end(), 0) << '\n';
}
Результат выполнения
count=3 sum=16

Сравнение C и C++

Версии на C приходится писать все циклы и самой следить за размером массива even, чтобы отобрать чётные числа, а затем сложить их. Версия на C++ сочетает std::copy_if для фильтрации и std::accumulate для суммирования по vector. Код короче и удобнее для повторного использования, а сложность остаётся такой же понятной, как у цикла, написанного вручную.

C

C использует соглашения об именах, обратные вызовы, макросы и struct с контекстом.

C++

C++ предлагает абстракции с чёткими границами, безопасные по типам и обычно без дополнительных затрат при выполнении.

Упражнения для практики

Запустите обе версии, а затем измените код, чтобы увидеть разницу в безопасности, которую даёт каждый язык.

  • Сначала напишите механизм на C, а затем используйте аналогичную возможность C++.
  • Замените ручное освобождение ресурсов на RAII.
  • Проверьте, не вызывает ли эта возможность выделение памяти или вызовы виртуальных функций.

Попрактикуйтесь на задаче

Примените материал этого урока к реальной задаче. Каждая задача запускается в браузере, с мгновенными тестами и разбором от ИИ.

Все задачи