2017-09-26 111 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

相關問題