C++ 如何使用布尔函数按降序对数组排序?

C++ 如何使用布尔函数按降序对数组排序?,c++,c++11,C++,C++11,因为我是竞争性编程新手,所以我觉得这有点困难。我遇到了一个代码,我无法理解它,需要一些帮助来理解它 #包括 #包括 使用名称空间std; 布尔迈科公司(内部a、内部b){ 返回a>b; } int main(){ int a[]={5,4,3,1,2,6,7}; int n=sizeof(a)/sizeof(int); 排序(a、a+n、mycompare); for(int i=0;i将一个RandomIt(随机迭代器)作为必须满足and要求的第一个和第二个参数。您不想使用一个普通的int旧数

因为我是竞争性编程新手,所以我觉得这有点困难。我遇到了一个代码,我无法理解它,需要一些帮助来理解它

#包括
#包括
使用名称空间std;
布尔迈科公司(内部a、内部b){
返回a>b;
}
int main(){
int a[]={5,4,3,1,2,6,7};
int n=sizeof(a)/sizeof(int);
排序(a、a+n、mycompare);
for(int i=0;i将一个
RandomIt
(随机迭代器)作为必须满足and要求的第一个和第二个参数。您不想使用一个普通的
int
旧数组,而是希望使用它为迭代器提供成员函数
。begin()
end()

< P>使用C++标准模板库中的适当容器进行排序,使用<代码> STD::排序微不足道。您甚至不需要提供自定义比较函数,按降序排序,如<代码>:STD::()(代码)< /C> >为您提供(虽然您的目的是提供比较函数)

mycompare的原型可以正常工作,但参数最好是
const type
,而不仅仅是
type
,例如

bool mycompare(const int a, const int b)
{
    return a > b;
}
使用数组容器的实现非常简单。只需声明/初始化数组
a
,然后调用
std::sort(a.begin(),a.end(),mycompare);
完整的工作示例如下:

#include <iostream>
#include <algorithm>
#include <array>

bool mycompare(const int a, const int b)
{
    return a > b;
}

int main (void) {

    std::array<int, 7> a = { 5, 4, 3, 1, 2, 6, 7 };

    std::sort (a.begin(), a.end(), mycompare);

    for (auto& i : a)
        std::cout << " " << i;
    std::cout << '\n';
}
对普通旧数组进行排序*

如果你必须使用一个普通的旧数组,那么你可以使用普通的指针作为随机的ItRealsor。虽然不是一个现代C++方法,你可以用“代码> STD::排序< /COD>处理普通的老数组。你可以使用Buffix<代码> STD::GooRead())/>代码>降序排序或<代码> STD::LASE()/<代码>升序排序。 使用指针的实现可以是:

#include <iostream>
#include <algorithm>

int main (void) {

    int a[] = { 5, 4, 3, 1, 2, 6, 7 };
    size_t n = sizeof a / sizeof *a;

#if defined (ASCEND)
    std::sort (a, a + n, std::less<int>());
#else
    std::sort (a, a + n, std::greater<int>());
#endif

    for (size_t i = 0; i < n; i++)
        std::cout << " " << a[i];
    std::cout << '\n';
}
#包括
#包括
内部主(空){
inta[]={5,4,3,1,2,6,7};
尺寸n=a的尺寸/a的尺寸*a;
#如果定义(上升)
std::sort(a,a+n,std::less());
#否则
std::sort(a,a+n,std::greater());
#恩迪夫
对于(大小i=0;istd::cout基于比较的排序算法仅通过成对比较对元素进行排序,即,如果
A
保持不变,则
A
必须放在
b
之前


这是一个很好的方法,但是如果你把自己局限于使用
你对它了解多少,以及你做了什么来尝试和理解其余的?如果你想学习如何工作,你需要学习更多关于排序和排序算法的一般知识。然后,应该非常清楚为什么需要比较函数以及如何使用它ode>mycompare
使用
大于
比较两个整数。如果
a
大于
b
,则函数返回
true
std::sort
接受要使用的比较器,该比较器在本例中是
mycompare
函数。因此它将使用该比较进行排序。mycompare函数将被调用在内部通过sort函数。您只是传递需要使用的函数的地址。否则将调用默认函数。我想指出,所有指向可交换类型的指针都满足
std::sort
的类型要求,因为指针是
随机访问迭代器的模型示例。因此,尽管它可能不是t“现代C++”样式,使用它,也没有什么本质上的错误。尤其是引用<代码> qSoSs>代码>对我来说是有害的。只要C++标准库中有替代品,我就不推荐任何C标准库中的算法。r、 
qsort
很可能比相应的
std::sort
慢得多,这在竞争性编程中尤为重要。你的第二句话似乎暗示你需要额外的样板代码来使用原始指针。事实并非如此,正如我在第一条评论中试图澄清的那样。我已经更新了code pre STL的指针示例。如果gcc使用完全相同的排序代码作为
qsort
std::sort
的基础,我会非常惊讶。gcc
qsort
是一个高度优化的快速排序混合体,当分区数低于在我最后一次检查的时候,它总是有点像“兔子的踪迹”通过Git树从文件到文件中跳过,来追查包含的片段和宏。但是我同意你的观点,如果C++提供了它,那么最好与没有C++实现的地方相比,比如“代码> Strutok < /Cuff>等等。我的要求实际上有点强:即使它们都实现了最快的最先进的S。在ORT算法中,
qsort
永远无法接近
std::sort
,因为它无法内联比较器函数指针。
$ ./bin/array_sort
 7 6 5 4 3 2 1
#include <iostream>
#include <algorithm>

int main (void) {

    int a[] = { 5, 4, 3, 1, 2, 6, 7 };
    size_t n = sizeof a / sizeof *a;

#if defined (ASCEND)
    std::sort (a, a + n, std::less<int>());
#else
    std::sort (a, a + n, std::greater<int>());
#endif

    for (size_t i = 0; i < n; i++)
        std::cout << " " << a[i];
    std::cout << '\n';
}
auto func_pointer = mycompare;
func_pointer(1, 2); // calls mycompare(1, 2)