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 | - | функция сравнения, которая возвращает отрицательное целое значение, если первый аргумент меньше второго, положительное целое значение, если первый аргумент больше второго, и ноль, если аргументы эквивалентны. Сигнатура функции сравнения должна быть эквивалентна следующей:
Функция не должна изменять передаваемые ей объекты и должна возвращать согласованные результаты при вызове для одних и тех же объектов, независимо от их положения в массиве. |
Возвращаемое значение
(нет)
Примечания
Несмотря на название, стандарты C++, C и POSIX не требуют, чтобы эта функция была реализована с помощью Quicksort или давали какие-либо гарантии сложности или стабильности.
Две перегрузки, предоставляемые стандартной библиотекой 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 |
Смотри также
| ищет элемент неуказанного типа в массиве (функция) | |
| сортирует диапазон элементов (шаблон функции & объект функции алгоритма) | |
(C++20) |
|
(C++11)(устарело в C++26) |
проверяет, является ли тип тривиальным (шаблон класса) |
Документация C для qsort
| |