2017-09-26 11 views
1

私は単一の.hファイルと複数の.cppファイルを持つプロジェクトを持っています。ヘッダファイルには、現在ソートを実装しているネームスペースUFu seful fの略語)が含まれています。これは、このようUF.cppで定義された比較器を有することによって行われる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; 
    } 

を、上記qsortとコンパレータ機能によってアクセスする必要があるベース・アレイbase_arr_intmain.cppで宣言され、UF.cppにexternedれます。

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'ではなく' sort'ですか? –

+0

@NickyCはい、main.cppのグローバル変数を避けるのに役立ちます。また、 'ratios'配列そのものをソートするのではなく、' ratios [indices [0]]が最小の要素である 'ratios [indices [1]]'に。 'std :: sort'はその機能に役立ちますか? – Tryer

答えて

1

グローバル変数の目的は、比喩的にカスタムコンパレータ内に配列を配置することです。グローバル変数を削除するには、文字通り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の書き方です。それは実際には非常に簡単です:ラムダ式

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

は、このラムダ式は、参照([&ratio])によって配列ratioをキャプチャします。それは2つの指標を取るパラメータリストを有する。本文は、ratioの2つの実際のオブジェクトを比較します。

古い学校の方法を好む場合は、ラムダ式は、次の単なるシンタックスシュガーです:

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'として宣言されています。次に、値を設定するためにこれを動的に新しいものにします。次に、 'SEP'のメンバ関数内で' std :: sort(indexofarray、indexofarray + 5、[&ratio](int index_left、int index_right){return ratio [index_left] Tryer

+1

メンバ変数の場合、' [this](int index_left、int index_right)のように 'this'ポインタを取得できます。 ){...}; 'https://stackoverflow.com/questions/7895879 –

+0

を参照してくださいありがとうございます。それは本当に問題を解決しました! – Tryer

関連する問題