Сегодня поговорим об оптимизации циклов в C++. Даже если ваш код работает, это не значит, что он работает быстро. Давайте разберём несколько трюков, которые помогут выжать максимум из циклов.
🔥 1. Избегайте ненужных вычислений внутри цикла
❌ Плохо:
for (int i = 0; i < vec.size(); i++) {
process(vec[i]);
}
✅ Хорошо:
size_t size = vec.size();
for (size_t i = 0; i < size; i++) {
process(vec[i]);
}
Почему?
vec.size() может вызываться при каждой итерации, что может замедлить выполнение, особенно если это не std::vector, а другой контейнер.⚡ 2. Используйте
reserve() для вектора Если вы заранее знаете, сколько элементов добавите в
std::vector, вызовите reserve(). Это сократит количество реаллокаций памяти.
std::vector<int> vec;
vec.reserve(1000); // резервируем место для 1000 элементов
for (int i = 0; i < 1000; i++) {
vec.push_back(i);
}
🏎️ 3. Предпочитайте
range-based for Классический цикл for:
for (size_t i = 0; i < vec.size(); i++) {
process(vec[i]);
}
Современный
range-based for:
for (const auto& elem : vec) {
process(elem);
}
Плюсы:
✅ Улучшает читаемость
✅ Избегает ненужных индексаций
✅ Позволяет компилятору оптимизировать код
🔄 4.
std::transform вместо for Если вы преобразуете данные из одного контейнера в другой, используйте
std::transform:
std::vector<int> src = {1, 2, 3, 4, 5};
std::vector<int> dst(src.size());
std::transform(src.begin(), src.end(), dst.begin(), [](int x) { return x * 2; });
Зачем?
✔️ Работает быстрее за счёт оптимизаций
✔️ Код становится короче и читабельнее
🎯 Вывод
Оптимизация циклов — это не магия, а грамотное использование возможностей C++. Убирайте лишние вычисления, используйте
reserve(), применяйте range-based for и std::transform, и ваш код станет быстрее и элегантнее.Используете ли вы
std::transform в своём коде? Делитесь в комментариях! 👇➡️ @cpp_geek