关于使用 std::less 和 std::greater 与 std::sort 的混淆

2023-11-23

在C语言中,排序通常实现如下例:

#include <stdio.h>

void Sort( int* arr, int n, bool(*cmp)(int,int) )
{
    for( int i=0; i<n-1; i++ )
    {
        for( int j=i+1; j<n; j++ )
        {
            if( cmp(arr[i], arr[j]) )
                swap( arr[i], arr[j] );
        }
    }
}

int ascending( int a, int b ) { return a > b; }    // greater
int descending( int a, int b ) { return a < b; }   // less

void main()
{
    int arr[10] = { 1,3,5,7,9,2,4,6,8,10 };

    // ascending
    Sort( arr, 10, ascending );
    for( int i=0; i<10; i++ )
        printf( "%d ", arr[i] );

    printf( "\n" );


    // descending
    Sort( arr, 10, descending );
    for( int i=0; i<10; i++ )
        printf( "%d ", arr[i] );

    printf( "\n" );
}

所以我写了一些源代码,如下例所示,期望得到相同的结果:

#include <iostream>
#include <algorithm>    // for sort
#include <functional>   // for less & greater
using namespace std;

bool gt( int a, int b ) { return a > b; }   // greater
bool ls( int a, int b ) { return a < b; }   // less

void main()
{
    int x[10] = { 1,3,5,7,9,2,4,6,8,10 };

    // ascending but descending
    sort( x, x+10, gt );
    for( int i=0; i<10; i++ )
        cout << x[i] << " ";

    cout << endl;

    // descending but ascending
    sort( x, x+10, ls );
    for( int i=0; i<10; i++ )
        cout << x[i] << " ";

    cout << endl;


    greater<int> g; // a > b
    less<int> l;    // a < b

    // ascending but descending
    sort( x, x+10, g );
    for( int i=0; i<10; i++ )
        cout << x[i] << " ";

    cout << endl;

    // descending but ascending
    sort( x, x+10, l );
    for( int i=0; i<10; i++ )
        cout << x[i] << " ";

    cout << endl;
}

但我的期望并不正确。

为什么 STL 中的排序不像 C 中的排序那样工作?


std::sort默认按升序排序。如果您正在寻找降序排列,请使用以下技巧:

int x[10] = { 1,3,5,7,9,2,4,6,8,10 };
std::vector<int> vec(x, x+10);          // construct std::vector object
std::sort(vec.rbegin(),vec.rend());     // sort it in reverse manner

这样,你就明确地说std::sort应该将您的数组视为其末尾就是其开头,反之亦然,这会导致您的数组按降序排序。这是完整的示例。


如果你想使用std::less and std::greater,那么它可能看起来像这样:

int x[10] = { 1,3,5,7,9,2,4,6,8,10 };
std::sort(x, x + 10, std::less<int>());     // for ascending order
std::sort(x, x + 10, std::greater<int>());  // for descending order

第二种解决方案的完整示例是here.

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

关于使用 std::less 和 std::greater 与 std::sort 的混淆 的相关文章

随机推荐

  • 定点的反平方根

    我正在寻找定点 16 16 数字的最佳反平方根算法 下面的代码是我到目前为止所拥有的 但基本上它取平方根并除以原始数字 我想得到不除法的倒数平方根 如果它发生任何改变 代码将为armv5te编译 uint32 t INVSQRT uint3
  • 为什么使用 static_cast(x) 而不是 (T)x?

    我听说static cast函数应该优先于 C 风格或简单函数风格的转换 这是真的 为什么 主要原因是经典的 C 类型转换不区分我们所说的static cast lt gt reinterpret cast lt gt const cast
  • 确定为特定函数调用分派哪个方法

    我试图理解一些我没有编写的代码 plot gam在 mgcv 中 并且有一个调用plot 函数带有一些我不认识的奇怪参数 例如 P 我想弄清楚这次调用正在调度哪个绘图方法 findMethod 和类似的功能没有帮助 我认为情节是S3 我尝试
  • php shell_exec 权限被拒绝

    shell exec touch Users Nerses Downloads ads txt 2 gt 1 我的 PHP exec shel exec 函数有问题 它说我没有执行该命令的权限 怎样才能打开这些权限呢 您的 PHP 代码正在
  • sql 2008 中没有索引的表列表

    如何列出 SQL 2008 数据库中没有索引的表 Edit我想要架构名称和表名称 这应该涵盖您正在寻找的内容 即堆表 无聚集索引 并且没有任何非聚集索引 它使用新的系统 2005 2008 年使用的表对象 此外 您可能想要查找具有聚集索引但
  • 添加属性时,如何保留 .NET 程序集的 COM 二进制兼容性?

    我们开发了一个 NET 程序集来存储语言翻译信息 并且需要由 VB6 应用程序使用 我们希望能够更改翻译信息而无需重新编译应用程序 翻译由名为 LanguageServices 的两个文件部分类提供 一个文件是不变的库方法 另一个文件是从
  • 如何在Cypress.io(电子/铬)中设置浏览器语言? [复制]

    这个问题在这里已经有答案了 我的问题是关于配置Cypress以某种语言启动浏览器实例 为了 对本地化 i18n 文本标签进行断言 检查 i18n 功能 在语言之间切换 绕过持续集成 CI CD 的问题 例如 本地计算机 浏览器默认为fr F
  • 如何将 Xcode 降级到以前的版本?

    我偶尔需要使用 Xcode 现在遇到一个问题 我已经升级到 Xcode 4 6 但我使用的另一个软件不支持它 所以我需要返回到 Xcode 4 5 我不习惯 Mac 的一般工作方式 因此如果所提供的答案可以在编写时考虑到这一点 那将会很有帮
  • Resharper Intellisense 可以配置为按字母顺序排序吗?

    我最近更新为使用 VS2013 和 Resharper 8 2 从 VS2010 和 Resharper 6 并发现了一个非常烦人的 feature 因为 Resharper 的智能感知不会按字母顺序对类成员进行排序 举例来说 我有一个名为
  • .NET 中的自定义文化感知日期格式

    在 NET 中 用于格式化 DateTime 值的大多数标准字符串都是区域性感知的 例如 ShortDatePattern d 格式字符串根据当前区域性切换年 月 日部分的顺序 6 15 2009 1 45 30 PM gt 6 15 20
  • PHP 作为 FastCGI 应用程序运行 (php-cgi) - 如何发出并发请求?

    编辑 更新 向下滚动 编辑2 更新 问题已解决 Some background information 我正在用 Java 编写自己的网络服务器 几天前我询问 Apache 与 PHP 的接口到底如何 这样我就可以实现 PHP 支持 我了解
  • .NET 中工作线程和 I/O 线程的简单描述

    在 NET 中很难找到工作线程和 I O 线程的详细但简单的描述 我对这个主题的了解很清楚 但技术上可能不准确 工作线程是这样的线程should使用 CPU 来完成工作 I O 线程 也称为 完成端口线程 should使用设备驱动程序来完成
  • 如何在 Numpy/MatplotLib 中可视化线性规划(具有任意不等式)的可行区域?

    我需要实现线性规划问题的求解器 所有限制都是 5x 10y 这些限制可以是任意数量的 另外 x gt 0 y gt 0 隐式 我需要找到最佳解决方案 最大值 并在 matplotlib 中显示可行区域 我通过实施单纯形法找到了最佳解决方案
  • Unwind Segue 在 Swift 3 和 iOS 10 中不起作用

    我正在尝试在 iOS 10 和 Swift 3 中测试 unwind segue I made a simple app like this 我添加了 segue 的代码TableViewController类并连接 取消 按钮并退出表视图
  • 从文本文件中删除^M字符的Shell命令[重复]

    这个问题在这里已经有答案了 可能的重复 删除 Unix 中的回车符 我正在读取外部第三方生成的一些数据 我注意到文件中的 ASCII 文本中散布着 M 字符 我认为这是 ASCII 中的字符 13 表示不带换行符的回车符 是否有一个行可以用
  • 如何在android中使用SharedPreference存储图像?

    我想使用 SharedPreference 在 android 中保存图像 我有两个活动类 当我单击第一个活动的按钮时 它将调用第二个活动 第二个活动在列表视图中显示我的首选名称 并将 Android 壁纸重置为我设置为首选壁纸的图像在第一
  • 将字符串列表作为 Airflow 中相关任务的参数传递

    我正在尝试通过以下方式将字符串列表从一个任务传递到另一个任务XCom但我似乎无法将推送列表解释回列表 例如 当我在某些函数中执行此操作时blah这是运行在ShortCircuitOperator paths gs format bucket
  • 获取 SoundCloud API 客户端 ID

    从浏览器访问我的轨迹时遇到问题 通常我在浏览器中输入此链接来访问可下载的曲目 http api soundcloud com tracks 294324164 download client id 02gUJC0hH2ct1EGOcYXQI
  • 将 google adsense 与 React + React Router 结合使用

    我正在尝试将 Google Adsense 集成到我的 React 网站中 但遇到了问题 为了在我的网页上投放广告 我已将此脚本标记包含在head我的 html 文件 这些广告被包装在一个简单的组件中 如下所示 export default
  • 关于使用 std::less 和 std::greater 与 std::sort 的混淆

    在C语言中 排序通常实现如下例 include