Контейнеры и алгоритмы STL в C++
В этом уроке вы сравните циклы, написанные вручную для обработки массива на C, с комбинацией готовых алгоритмов стандартной библиотеки C++.
Введение
Стандартная библиотека C++ (STL) предоставляет контейнеры вроде vector и множество готовых алгоритмов для фильтрации, суммирования и сортировки. Эти алгоритмы работают с диапазоном итераторов, что отделяет обработку от способа хранения данных.
Главное
- Поймите, как это делается в C, прежде чем изучать абстракции C++.
- Выражайте владение ресурсами через RAII и семантику значений (value semantics).
- Используйте типобезопасные средства C++ вместо макросов и приведений типов.
Примеры кода на C и 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
#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 использует соглашения об именах, обратные вызовы, макросы и struct с контекстом.
C++ предлагает абстракции с чёткими границами, безопасные по типам и обычно без дополнительных затрат при выполнении.
Упражнения для практики
Запустите обе версии, а затем измените код, чтобы увидеть разницу в безопасности, которую даёт каждый язык.
- Сначала напишите механизм на C, а затем используйте аналогичную возможность C++.
- Замените ручное освобождение ресурсов на RAII.
- Проверьте, не вызывает ли эта возможность выделение памяти или вызовы виртуальных функций.
Попрактикуйтесь на задаче
Примените материал этого урока к реальной задаче. Каждая задача запускается в браузере, с мгновенными тестами и разбором от ИИ.
- Медиана списка Найдите среднее значение списка после сортировки. Легко
- Второе по величине значение Найдите второе по величине уникальное значение. Легко