C++sort函数

很多算法都会比较输入序列中的元素。默认情况下,这类算法使用元素类型的<或者==运算符来完成比较。标准库还为这些算法定

义了额外的版本,允许我们提供自己定义的的操作来代替默认运算符。

以sort函数为例,默认使用<来进行比较,元素按照从小到大排序。

sort函数的第二个版本接受第三个参数,此参数是一个谓词

谓词

 谓词是一个可调用表达式,其返回结果是一个能用作条件的值。

标准库算法所使用的谓词分为两类:一元谓词(只接受单一参数)和二元谓词(有两个参数)。

接受谓词参数的算法对输入序列中的元素调用谓词。因此,元素类型必须能转换为谓词的参数类型。

对于sort函数,其谓词的操作必须能够在输入序列中所有可能的元素值上定义一个一致的序。

若想从大到小排序,定义一个比较函数

bool isBigger(int &a,int &b)
{
    return a>b;
}

若想将一个vector<string>中的元素长度进行排序。

bool isShorter(const string &s1,const string &s2)
{
    return s1.size()<s2.size();
}

注意:

若在类中使用sort函数调用比较函数,最好将函数声明为static或者将函数设置为全局函数,从而避免出现以下错误。

reference to non - static member function must be call

lambda表达式

算法接受的一元谓词还是二元谓词,我们传递给算法的谓词必须严格接受一个或两个参数。但是,有时我们希望进行的操作需要

更多的参数,超出了算法对谓词的严格限制。

一个lambda表达式与任何函数类似,具有一个返回类型,一个参数列表和一个函数体。但与函数不同,lambda可能定义在函数内

部。

一个lambda表达式的形式:

[capture list](parameter list) ->return type{function body}

capture list 捕获列表是一个lambda所在函数中定义的局部变量的列表(通常为空);

return type、parameter和function body与任何普通函数一样,分别表示返回类型、参数列表和函数体。

但是,与普通函数不同的是,lambda必须使用尾置返回来指定返回类型。

我们可以忽略参数列表和返回类型,但是必须包含捕获列表和函数体。

auto f=[] {return 42;};

我们可以编写一个与isShorter函数完全相同功能的lambda:

[] (const string &a,const string &b)
    {return a.size()<b.size();}

空捕获列表表明此lambda不使用它所在函数中的任何局部变量。

那么对于调用该lambda表达书的函数为

sort(words.begin(),words.end(),
    [](const string &a,const string &b)
        {return a.size()<b.size();}

一个lambda表达式只有在其捕获列表中捕获一个它所在函数中的局部变量,才能在函数体中使用该变量。

 


参考:《C++primer》(第五版)

 

 

 

 

 

 

 

C++ STL标准库中的sort()函数是一个模板函数,位于头文件&lt;algorithm&gt;中。该函数用于对容器或普通数组中指定范围内的元素进行排序,默认是升序排序。可以选择标准库的其他排序规则,或者自定义排序规则。sort()函数的参数模板是void sort(RandomAccessIterator first, RandomAccessIterator last, Compare comp),其中first表示起始位置(左闭),last表示结束位置(右开),comp表示排序规则(比较器),可以省略,默认是升序。可以通过传入自定义的排序规则来实现不同的排序效果。例如,可以使用sort(a, a+10)来对数组a进行升序排序。也可以使用自定义的升序或降序函数来实现自定义排序规则。在使用自定义排序规则时,需要注意正确使用非静态成员函数,以避免编译错误。&lt;span class=&quot;em&quot;&gt;1&lt;/span&gt;&lt;span class=&quot;em&quot;&gt;2&lt;/span&gt;&lt;span class=&quot;em&quot;&gt;3&lt;/span&gt; #### 引用[.reference_title] - *1* *2* *3* [C++ sort 函数](https://blog.csdn.net/qq_19887221/article/details/124380534)[target=&quot;_blank&quot; data-report-click={&quot;spm&quot;:&quot;1018.2226.3001.9630&quot;,&quot;extra&quot;:{&quot;utm_source&quot;:&quot;vip_chatgpt_common_search_pc_result&quot;,&quot;utm_medium&quot;:&quot;distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2&quot;}}] [.reference_item style=&quot;max-width: 100%&quot;] [ .reference_list ]
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值