C++11标准模板(STL)- 算法 - 对一个范围内的拥有一定未指定类型的元素排序(qsort, qsort_s)

news/2024/11/18 9:06:02/

定义于头文件 <stdlib.h>

算法库提供大量用途的函数(例如查找、排序、计数、操作),它们在元素范围上操作。注意范围定义为 [first, last) ,其中 last 指代要查询或修改的最后元素的后一个元素。

对一个范围内的拥有一定未指定类型的元素排序

qsort, 
qsort_s

定义于头文件 <stdlib.h>

void qsort( void *ptr, size_t count, size_t size,
            int (*comp)(const void *, const void *) );

(1)
errno_t qsort_s( void *ptr, rsize_t count, rsize_t size,

                 int (*comp)(const void *, const void *, void *),

                 void *context );
(2)(C11 起)

1) 对 ptr 所指向的数组以升序排序。数组包含 count 个长度为 size 字节的元素。用 comp 所指向的函数比较对象。

2) 同 (1) ,除了传递给 comp 附加环境参数 context ,还会在运行时检测下列错误,并调用当前安装的制约处理函数:

  • countsize 大于 RSIZE_MAX
  • keyptrcomp 是空指针(除非 count 为零)

同所有边界检查函数, qsort_s 仅若实现定义了 __STDC_LIB_EXT1__ ,且用户在包含 stdlib.h 前定义 __STDC_WANT_LIB_EXT1__ 为整数常量 1 才保证可用。

comp 指示两元素相等,则它们排序后的结果是未指定的。

参数

ptr-指向待排序的数组的指针
count-数组的元素数目
size-数组每个元素的字节大小
comp-比较函数。若首个参数小于第二个,则返回负整数值,若首个参数大于第二个,则返回正整数值,若两参数相等,则返回零。

比较函数的签名应等价于如下形式:

 int cmp(const void *a, const void *b);

该函数必须不修改传递给它的对象,而且在调用比较相同对象时必须返回一致的结果,无关乎它们在数组中的位置。

context-附加信息(例如,对照序列),作为第三个参数传递给 comp

返回值

1) (无)

2) 成功时为零,若检测到运行时制约违规,则为非零

注意

与名称无关,C 和 POSIX 标准都未要求此函数用快速排序实现,也未保证任何复杂度或稳定性。

与其他边界检查函数不同, qsort_s 不将零大小数组视作运行时强制违规,而是不修改数组并成功返回(另一个接受零大小数组的函数是 bsearch_s )。

qsort_s 之前,qsort 的用户通常用全局变量来将附加语境传递给比较函数。

调用示例

#include <iostream>
#include <algorithm>
#include <functional>
#include <vector>
#include <iterator>
#include <time.h>using namespace std;struct Cell
{int x;int y;Cell &operator +=(const Cell &cell){x += cell.x;y += cell.y;return *this;}bool operator <(const Cell &cell) const{if (x == cell.x){return y < cell.y;}else{return x < cell.x;}}bool operator >(const Cell &cell) const{if (x == cell.x){return y > cell.y;}else{return x > cell.x;}}
};int compare_Cells_less(const void* a, const void* b)
{Cell arg1 = *(const Cell*)a;Cell arg2 = *(const Cell*)b;if (arg1 < arg2){return -1;}if (arg1 > arg2){return 1;}return 0;// return (arg1 > arg2) - (arg1 < arg2); // 可行的简写// return arg1 - arg2; // 错误的简写(若给出 INT_MIN 则会失败)
}int compare_Cells_greater(const void* a, const void* b)
{Cell arg1 = *(const Cell*)a;Cell arg2 = *(const Cell*)b;if (arg1 < arg2){return 1;}if (arg1 > arg2){return -1;}return 0;
}std::ostream &operator<<(std::ostream &os, const Cell &cell)
{os << "{" << cell.x << "," << cell.y << "}";return os;
}int main()
{srand((unsigned)time(NULL));;std::cout.setf(std::ios_base::boolalpha);auto func1 = [](){int n = std::rand() % 10 + 100;Cell cell{n, n};return cell;};Cell cells[] = {{0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}};std::generate(std::begin(cells), std::end(cells), func1);std::cout << "cells :               ";std::copy(std::begin(cells), std::end(cells), std::ostream_iterator<Cell>(std::cout, " "));std::cout << std::endl;std::cout << "is_sorted:            " << std::is_sorted(std::begin(cells), std::end(cells));std::cout << std::endl << std::endl;qsort(cells, std::distance(std::begin(cells), std::end(cells)), sizeof(Cell), compare_Cells_less);std::cout << "cells :               ";std::copy(std::begin(cells), std::end(cells), std::ostream_iterator<Cell>(std::cout, " "));std::cout << std::endl;std::cout << "is_sorted:            " << std::is_sorted(std::begin(cells), std::end(cells));std::cout << std::endl << std::endl;auto is_sortf = [](const Cell & a, const Cell & b){if (a.x == b.x){return a.y > b.y;}return a.x > b.x;};std::generate(std::begin(cells), std::end(cells), func1);std::cout << "cells :               ";std::copy(std::begin(cells), std::end(cells), std::ostream_iterator<Cell>(std::cout, " "));std::cout << std::endl;std::cout << "is_sorted:            " << std::is_sorted(std::begin(cells), std::end(cells), is_sortf);std::cout << std::endl << std::endl;qsort(cells, std::distance(std::begin(cells), std::end(cells)), sizeof(Cell), compare_Cells_greater);std::cout << "cells :               ";std::copy(std::begin(cells), std::end(cells), std::ostream_iterator<Cell>(std::cout, " "));std::cout << std::endl;std::cout << "is_sorted:            " << std::is_sorted(std::begin(cells), std::end(cells), is_sortf);std::cout << std::endl << std::endl;return 0;
}

输出

cells :               {109,109} {106,106} {107,107} {106,106} {108,108}
is_sorted:            falsecells :               {106,106} {106,106} {107,107} {108,108} {109,109}
is_sorted:            truecells :               {103,103} {105,105} {108,108} {109,109} {108,108}
is_sorted:            falsecells :               {109,109} {108,108} {108,108} {105,105} {103,103}
is_sorted:            true


http://www.ppmy.cn/news/1547946.html

相关文章

手机版产品目录如何制作?

随着互联网的快速发展&#xff0c;手机已经成为人们日常生活中不可或缺的一部分。许多企业都开始重视手机端的产品展示&#xff0c;而手机版产品目录的制作就显得尤为重要。现在由我来教大家手机版产品目录制作的步骤、技巧&#xff0c;轻松打造一款高颜值、易操作的移动端产品…

软件测试之测试用例扩展

软件测试之测试用例扩展 1. 测试用例覆盖2. UI布局覆盖3. 兼容性覆盖4. 测试用例条数 1. 测试用例覆盖 规则覆盖UI布局兼容性 2. UI布局覆盖 2条用例即可 布局, 颜色与原型图一致图片和文字描述无误 3. 兼容性覆盖 测试5大浏览器 火狐谷歌ieEge苹果 4. 测试用例条数 使…

前端三大组件之CSS,三大选择器,游戏网页仿写

回顾 full stack全栈 Web前端三大组件 结构(html) 样式(css) 动作/交互(js) --- 》 框架vue&#xff0c;安哥拉 div 常用的标签 扩展标签 列表 ul/ol order——有序号 unordered——没序号的黑点 <!DOCTYPE html> <html><head><meta charset"…

操作系统——计算机系统概述——1.5操作系统引导(开机过程)

操作系统引导&#xff1a; A.CPU从一个特定主存地址开始&#xff0c;取指令&#xff0c;执行ROM中的引导程序&#xff08;先进行硬件自检&#xff0c;再开机&#xff09; B.将磁盘的第一块——主引导记录读入内存&#xff0c;执行磁盘引导程序&#xff0c;扫描分区表 C.从活动分…

Hugging_Face下载

能进huggingface的就能翻过去 不行的话可以去参考这个:mojie.app 1.直接原网下载 2.git(小白勿入) 如果是Linux&#xff0c;可以搜一个叫HFD&#xff08;HuggingFace_Download&#xff09; Windows的git安装参考如下&#xff1a;Git安装 建议先看看这个文档&#xff0c; 如果…

PHP 表单 - 必需字段

PHP 表单 - 必需字段 在Web开发中&#xff0c;表单是用户与网站交互的重要方式。开发者经常需要确保用户填写了某些关键信息&#xff0c;这些信息被称为必需字段。在PHP中&#xff0c;处理必需字段通常涉及到验证用户输入&#xff0c;并在必要时提供反馈。本文将详细介绍如何在…

嵌入式硬件实战基础篇(一)-STM32+DAC0832 可调信号发生器-产生方波-三角波-正弦波

引言&#xff1a;本内容主要用作于学习巩固嵌入式硬件内容知识&#xff0c;用于想提升下述能力&#xff0c;针对学习STM32与DAC0832产生波形以及波形转换&#xff0c;对于硬件的降压和对于前面硬件篇的实际运用&#xff0c;针对仿真的使用&#xff0c;具体如下&#xff1a; 设…

电子电气架构 -- 下一代整车电网

我是穿拖鞋的汉子&#xff0c;魔都中坚持长期主义的汽车电子工程师。 老规矩&#xff0c;分享一段喜欢的文字&#xff0c;避免自己成为高知识低文化的工程师&#xff1a; 所有人的看法和评价都是暂时的&#xff0c;只有自己的经历是伴随一生的&#xff0c;几乎所有的担忧和畏惧…