有没有办法避免有全局变量来实现qsort
我有一个单一的.h
文件和多个.cpp
文件的项目。头文件包含当前实现排序的名称空间UF
(缩写或 seful f联合)。有没有办法避免有全局变量来实现qsort
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;
}
目前,需要基本阵列base_arr_int
由qsort
访问和比较器功能的上方在main.cpp
声明并在UF.cpp
externed:
这是通过具有在UF.cpp
由此限定一个比较器进行。
我访问qsort
在不同的类,SEP
如下。首先,在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};
但是你不想直接对它进行排序。你创建一个实际得到排序的指数数组。
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
。它有两个参数列表。身体比较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'。然后,我动态地新建这个以填充值。然后,我有'std :: sort(indexofarray,indexofarray + 5,[&ratio](int index_left,int index_right){return ratio [index_left]
在成员变量的情况下,你可以捕获'this'指针,如'[this](int index_left,int index_right ){...};'看到https://stackoverflow.com/questions/7895879 –
谢谢。那确实解决了问题! – Tryer
你愿意考虑'的std ::排序'而不是'qsort'? –
@NickyC是的,如果它有助于避免main.cpp中的全局变量。另外,我不会对'比率'数组本身进行排序,而是对索引进行排序,以便比率[indices [0]]是最小的元素,比率[indices [1]]'上。 'std :: sort'有助于这个功能吗? – Tryer