C++ 有没有办法避免使用全局变量来实现qsort

C++ 有没有办法避免使用全局变量来实现qsort,c++,qsort,C++,Qsort,我有一个项目,有一个.h文件和多个.cpp文件。头文件包含当前实现排序的命名空间UF(sefulf函数的缩写) 这是通过在UF.cpp中定义比较器来实现的,因此: int compar_int_asc(const void *a, const void *b) { int aa = *((int *)a), bb = *((int *)b); if (base_arr_int[aa] < base_arr_int[bb])

我有一个项目,有一个
.h
文件和多个
.cpp
文件。头文件包含当前实现排序的命名空间
UF
(sefulf函数的缩写)

这是通过在
UF.cpp
中定义比较器来实现的,因此:

    int compar_int_asc(const void *a, const void *b)
    {
        int aa = *((int *)a), bb = *((int *)b);
        if (base_arr_int[aa] < base_arr_int[bb])
            return -1;
        if (base_arr_int[aa] == base_arr_int[bb])
            return 0;
        if (base_arr_int[aa] > base_arr_int[bb])
            return 1;
    }
这是用多个类实现qsort的最佳方法吗


特别是,我希望尽量避免使用
main.cpp
中定义的全局变量。是否有其他设计?

全局变量的目的是形象地将数组放置在自定义比较器中。为了消除全局变量,让我们将
ratio
放入自定义比较器。为此,自定义比较器不能是普通函数或函数指针。它需要是一个函数对象。并且
std::sort
支持这一点

让我们一步一步地做吧


因此,您有一个存储东西的数组

int ratio[5] = {300, 400, 200, 500, 100};
但你不想直接排序。您可以创建一个索引数组,实际将其排序

int indice[5] = {0, 1, 2, 3, 4};
目标是排序
标记
。让我们写下:

std::sort(indice, indice + 5);
但这还不是你想要的。您还需要传递一个自定义比较器
index\u comp
,因为默认的小于比较器不是您需要的

std::sort(indice, indice + 5, index_comp);
剩下的工作是如何编写
索引\u comp
。其实很简单:lambda表达式

auto index_comp = [&ratio](int index_left, int index_right) { return ratio[index_left] < ratio[index_right]; };
整个代码:

#include <iostream>
#include <algorithm>

int main()
{
    int ratio[5] = {300, 400, 200, 500, 100};
    int indice[5] = {0, 1, 2, 3, 4};

    auto index_comp = [&ratio](int index_left, int index_right) { return ratio[index_left] < ratio[index_right]; };

    std::sort(indice, indice + 5, index_comp);

    for (int i = 0; i < 5; ++i)
        std::cout << ratio[indice[i]] << ' ';
}
#包括
#包括
int main()
{
整数比率[5]={300400200500100};
int indice[5]={0,1,2,3,4};
自动索引_comp=[&ratio](int-index _-left,int-index _-right){返回比率[索引_-left]<比率[索引_-right];};
标准::排序(指数、指数+5、指数+比较);
对于(int i=0;i<5;++i)

STD::你想考虑<代码> STD::排序< <代码> >而不是<代码> qSeord?@ NICYC,是的,如果它有助于避免MIN .CPP中的全局变量。而且,我不排序<代码>比率数组本身,而是排序<代码>索引< /代码>,使<代码>比率[索引[0 ] ] /代码>是最小的元素,<代码>比率[索引[1 ] ]。
下一个最小值,依此类推。
std::sort
对该功能有帮助吗?我在实现该功能时遇到了一些问题。在我的
SEP
类中,我将
ratio
声明为
int*ratio
。然后,我动态地新建它以填充值。然后,我将
std::sort(indexofarray,indexofarray+5,[&ratio](int-index_-left,int-index_-right){return ratio[index_-left]
SEP
的成员函数中,但这给了我以下错误:
成员“SEP::ratio”不是变量
对于成员变量,可以捕获
this
指针,如
[this](int index_left,int index_right){…};
请参见
class Compiler_Generated_Name
{
private:
    int (&ratio)[5];

public:
    Compiler_Generated_Name(int (&ratio_)[5]) : ratio(ratio_) {}

    bool operator()(int index_left, int index_right)
    {
        return ratio[index_left] < ratio[index_right];
    }
};

Compiler_Generated_Name index_comp(ratio);
#include <iostream>
#include <algorithm>

int main()
{
    int ratio[5] = {300, 400, 200, 500, 100};
    int indice[5] = {0, 1, 2, 3, 4};

    auto index_comp = [&ratio](int index_left, int index_right) { return ratio[index_left] < ratio[index_right]; };

    std::sort(indice, indice + 5, index_comp);

    for (int i = 0; i < 5; ++i)
        std::cout << ratio[indice[i]] << ' ';
}