有没有办法避免具有实现QSort的全局变量

Is there a way to avoid having global variable to implement qsort

本文关键字:实现 QSort 全局变量 有没有      更新时间:2023-10-16

我有一个带有一个.h文件和多个.cpp文件的项目。标题文件包含一个命名空间UF> u seful f f Unctions的缩写)当前实现排序。

这是通过在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需要访问的基本数组base_arr_int和上面的比较函数在main.cpp中声明并在UF.cpp中进行外观。

i在其他类中访问qsortSEP如下。首先,在SEP.cpp中,我extern base_arr_int。然后,如果ratios[100]是一个本地且对SEP本地的整数数组,则在SEP.cpp中进行以下操作。

base_arr_int = ratios;
qsort(indices, 100, sizeof(int), UF::compar_int_asc);

这是通过多个类实施QSort的最佳方法?

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

全局变量的目的是将数组形象放置在自定义比较器中。为了消除全局变量,让我们从字面上将ratio放入自定义比较器中。为此,自定义比较器不能是普通功能指针。它需要是函数对象。和std::sort支持。

让我们逐步进行。


所以,您有一个存储东西的数组。

int ratio[5] = {300, 400, 200, 500, 100};

,但您不想直接对其进行排序。您可以创建一个真正被分类的Indice数组。

int indice[5] = {0, 1, 2, 3, 4};

目标是对indice进行排序。所以让我们写:

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

但这还不是您想要的。您还需要传递自定义比较器index_comp,因为默认的比较少于比较器不是您需要的。

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

其余工作是如何编写index_comp。实际上很简单:lambda表达

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

此lambda表达式通过参考([&ratio])捕获数组ratio。它具有一个参数列表,其中有两个Indice。身体比较了ratio中的两个实际对象。

如果您喜欢旧学校的方式,则lambda表达只是以下语法:

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]] << ' ';
}