Spec-Zone.ru › C++

std::qsort

Определён в заголовочном файле <cstdlib>
void qsort( void *ptr, std::size_t count,
            std::size_t size, /* c-compare-pred */* comp );
void qsort( void *ptr, std::size_t count,
            std::size_t size, /* compare-pred */* comp );
(1)
extern "C" using /* c-compare-pred */ = int(const void*, const void*);
extern "C++" using /* compare-pred */ = int(const void*, const void*);
(2) (только для пояснения*)

Сортирует указанный массив, на который указывает ptr, в порядке возрастания. Массив содержит count элементов размером size байт. Для сравнения объектов используется функция, на которую указывает comp.

Если comp считает два элемента эквивалентными, их порядок не определён.

Если тип элементов массива не является PODType(до C++11)типом TriviallyCopyable(начиная с C++11), поведение не определено.

Параметры

ptr - указатель на сортируемый массив
count - количество элементов в массиве
size - размер каждого элемента массива в байтах
comp - функция сравнения, которая возвращает отрицательное целое значение, если первый аргумент меньше второго, положительное целое значение, если первый аргумент больше второго, и ноль, если аргументы эквивалентны.

Сигнатура функции сравнения должна быть эквивалентна следующей:

intcmp(constvoid*a,constvoid*b);

Функция не должна изменять переданные ей объекты и должна возвращать согласованные результаты при вызове для одних и тех же объектов независимо от их положения в массиве.

​

Возвращаемое значение

(нет)

Примечания

Несмотря на название, стандарты C++, C и POSIX не требуют реализации этой функции с использованием быстрой сортировки и не дают никаких гарантий сложности или стабильности.

Две перегрузки, предоставляемые стандартной библиотекой C++, являются различными, поскольку типы параметра comp различаются (языковая связь является частью его типа).

Пример

Следующий код сортирует массив целых чисел с помощью qsort():

#include <array>
#include <climits>
#include <compare>
#include <cstdlib>
#include <iostream>

int main()
{
    std::array a{-2, 99, 0, -743, INT_MAX, 2, INT_MIN, 4};
    
    std::qsort
    (
        a.data(),
        a.size(),
        sizeof(decltype(a)::value_type),
        [](const void* x, const void* y)
        {
            const int arg1 = *static_cast<const int*>(x);
            const int arg2 = *static_cast<const int*>(y);
            const auto cmp = arg1 <=> arg2;
            if (cmp < 0)
                return -1;
            if (cmp > 0)
                return 1;
            return 0;
        }
    );
    
    for (int ai : a)
        std::cout << ai << ' ';
    std::cout << '\n';
}

Вывод:

-2147483648 -743 -2 0 2 4 99 2147483647

Отчёты об ошибках

Следующие отчёты об ошибках, изменяющие поведение, были ретроактивно применены к ранее опубликованным стандартам C++.

DR Применён к Опубликованное поведение Правильное поведение
LWG 405 C++98 элементы массива могли иметь любой тип ограничено типом PODType

См. также

bsearch
выполняет поиск в массиве элемента неуказанного типа
(функция)
sort
сортирует диапазон элементов
(шаблон функции и функциональный объект-алгоритм)
ranges::sort
(C++20)
is_trivial
(C++11)(устарело в C++26)
проверяет, является ли тип тривиальным
(шаблон класса)
Документация C для qsort

© cppreference.com
Licensed under the Creative Commons Attribution-ShareAlike Unported License v3.0.
https://en.cppreference.com/cpp/algorithm/qsort

Spec-Zone.ru

Настройки Оффлайн Что нового Помощь О нас
Spec-Zone .ru
спецификации, руководства, описания, API