std::qsort
來自 cppreference.com
定義於標頭檔案 <cstdlib> |
||
void qsort( void *ptr, std::size_t count, std::size_t size, /* c-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 前)可平凡複製型別(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++ 標準。
缺陷報告 | 應用於 | 釋出時的行為 | 正確的行為 |
---|---|---|---|
LWG 405 | C++98 | 陣列元素可以有任何型別 | 限於 PODType |
[編輯] 參閱
在陣列中搜索未指定型別的元素 (函式) | |
將一個範圍按升序排序 (函式模板) | |
(C++11)(C++26 中已棄用) |
檢查型別是否為平凡型別 (類模板) |
C 文件 關於 qsort
|