【问题标题】:Is there a way to avoid having global variable to implement qsort有没有办法避免使用全局变量来实现 qsort
【发布时间】:2018-03-07 02:13:33
【问题描述】:

我有一个项目,其中包含一个 .h 文件和多个 .cpp 文件。头文件包含一个当前实现排序的命名空间UFuseful functions 的缩写)。

这是通过在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中被externed。

我在不同的类SEP 中访问qsort,如下所示。首先,在SEP.cpp,我外部base_arr_int。然后,如果ratios[100]SEP 本地和本地的整数数组,我在SEP.cpp 内执行以下操作。

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

这是用多个类实现 qsort 的最佳方式吗?

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

【问题讨论】:

  • 你想考虑std::sort而不是qsort吗?
  • @NickyC 是的,如果它有助于避免 main.cpp 中的全局变量。另外,我不对ratios 数组本身进行排序,而是对indices 进行排序,使ratios[indices[0]] 是最小的元素,ratios[indices[1]] 是下一个最小的元素,依此类推。 std::sort 是否有助于实现该功能?

标签: c++ qsort


【解决方案1】:

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

让我们一步一步来。


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

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

但您不想直接对其进行排序。您创建一个实际排序的索引数组。

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 表达式通过引用 ([&amp;ratio]) 捕获数组 ratio。它有一个带有两个索引的参数列表。正文比较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]] << ' ';
}

【讨论】:

  • 我在实现这一点时遇到了一些麻烦。在我的SEP 类中,我将ratio 声明为int *ratio。然后我动态地新建它以填充这些值。然后,我在SEP 的成员函数中有std::sort(indexofarray, indexofarray + 5, [&amp;ratio](int index_left, int index_right) { return ratio[index_left] &lt; ratio[index_right]; });,但这给了我以下错误:member "SEP::ratio" is not a variable
  • 在成员变量的情况下,可以捕获this指针,如[this](int index_left, int index_right) { ... };stackoverflow.com/questions/7895879
猜你喜欢
  • 1970-01-01
  • 2021-10-07
  • 2013-06-27
  • 2017-09-01
  • 2012-12-19
  • 2016-05-23
  • 1970-01-01
  • 2019-09-07
  • 1970-01-01
相关资源
最近更新 更多