2017-09-26 112 views
1

我有一个单一的.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_intqsort访问和比较器功能的上方在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中定义的全局变量。有没有其他设计?

+3

你愿意考虑'的std ::排序'而不是'qsort'? –

+0

@NickyC是的,如果它有助于避免main.cpp中的全局变量。另外,我不会对'比率'数组本身进行排序,而是对索引进行排序,以便比率[indices [0]]是最小的元素,比率[indices [1]]'上。 'std :: sort'有助于这个功能吗? – Tryer

回答

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表达式捕获由参考([&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]] << ' '; 
} 
+0

我在执行此操作时遇到了一些麻烦。在我的'SEP'类中,我将'ratio'声明为'int * ratio'。然后,我动态地新建这个以填充值。然后,我有'std :: sort(indexofarray,indexofarray + 5,[&ratio](int index_left,int index_right){return ratio [index_left] Tryer

+1

在成员变量的情况下,你可以捕获'this'指针,如'[this](int index_left,int index_right ){...};'看到https://stackoverflow.com/questions/7895879 –

+0

谢谢。那确实解决了问题! – Tryer

相关问题