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 - функция сравнения, возвращающая:
  • отрицательное целое значение, если первый аргумент меньше второго;
  • положительное целое значение, если первый аргумент больше второго;
  • ноль, если аргументы эквивалентны.

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

int cmp(const void *a, const void *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
сортирует диапазон в порядке возрастания
(шаблон функции)
is_trivial
(C++11)
проверяет, является ли тип тривиальным
(шаблон класса)
Документация C для qsort

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

Spec-Zone.ru

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