Использование std::sort в C++

Автор: | 12 июня, 2025

Одной из важнейших задач в программировании является сортировка данных. В стандартной библиотеке C++ (STL) для этого предназначен алгоритм std::sort, находящийся в заголовочном файле <algorithm>. Это универсальный, высокоэффективный инструмент, который подходит для большинства задач сортировки в современных C++ проектах.

Общий синтаксис

#include <algorithm>
#include <vector>

std::sort(begin, end);                        // Сортировка по умолчанию (по возрастанию)
std::sort(begin, end, compare_function);      // Сортировка с использованием компаратора

begin и end — итераторы начала и конца диапазона (например, v.begin() и v.end()).

compare_function — функция или лямбда, определяющая порядок элементов.

std::sort основан на гибриде алгоритмов, таких как QuickSort, HeapSort и InsertionSort. Он оптимизирован под большинство сценариев и обычно работает за O(n log n) времени.

Примеры использования

Сортировка чисел по возрастанию

#include <iostream>
#include <vector>
#include <algorithm>

int main() {
    std::vector<int> numbers = {5, 3, 8, 1, 4};
    std::sort(numbers.begin(), numbers.end());

    for (int num : numbers)
        std::cout << num << " ";  // Результат: 1 3 4 5 8
}

Сортировка по убыванию

std::sort(numbers.begin(), numbers.end(), std::greater<int>());

// Или с лямбдой:
std::sort(numbers.begin(), numbers.end(), [](int a, int b) {
    return a > b;
});

Сортировка пользовательских структур

struct Person {
    std::string name;
    int age;
};

std::vector<Person> people = {
    {"Alice", 30},
    {"Bob", 25},
    {"Charlie", 35}
};

std::sort(people.begin(), people.end(), [](const Person& a, const Person& b) {
    return a.age < b.age;
});

Важные замечания

  • std::sort требует RandomAccessIterator — то есть он работает с std::vector, std::array, C-массивами, но не работает с std::list.
  • Если вам нужен стабильный порядок (при равных элементах сохраняется исходный порядок), используйте std::stable_sort.
  • Можно использовать std::sort и с указателями на массивы:
int arr[] = {3, 1, 4};
std::sort(arr, arr + 3);

Советы по производительности

  • Используйте reserve() или resize() заранее для векторов, чтобы избежать перераспределения памяти.
  • Не забывайте про std::move в случае сортировки объектов, поддерживающих перемещение — это ускорит выполнение.
  • Для больших данных, требующих стабильности сортировки, std::stable_sort может быть более подходящим, несмотря на чуть большую нагрузку по памяти.

std::sort — это мощный и удобный инструмент для быстрой сортировки любых данных в C++. Его гибкость, высокая производительность и простота использования делают его предпочтительным выбором в большинстве случаев. Используйте std::sort вместе с лямбда-функциями и собственными компараторами для адаптации под любые задачи.