2017-09-26 7 views
1

.h 파일 하나와 여러 개의 .cpp 파일을 가진 프로젝트가 있습니다. 헤더 파일에는 현재 정렬을 구현하는 UF (u 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

당신이'표준을 고려 하시겠습니까 :: 'qsort' 대신'sort'를 사용합니까? –

+0

@NickyC 예, main.cpp의 전역 변수를 피하면 도움이됩니다. 또한,'ratios' 배열 자체를 정렬하지는 않지만'ratios [indices [0] '는 가장 작은 요소이고'ratios [indices [1]]'는 가장 작기 때문에'indices'를 정렬합니다. 에. '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 캡처. 그것에는 두 개의 지표를 취하는 매개 변수 목록이 있습니다. 본문에서는 ratio의 두 실제 객체를 비교합니다.

당신은 구식 방법을 선호하는 경우, 람다 표현식은 다음의 단지 구문 설탕은 다음과 같습니다

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'클래스에서는 '비율'이 'int * ratio'로 선언되었습니다. 그런 다음 값을 채우기 위해이를 동적으로 새롭게 만듭니다. 그런 다음,'SEP'의 멤버 함수 내에서 std :: sort (indexofarray, indexofarray + 5, [& 비율] (int index_left, int index_right) {수익률 [index_left] <비율 [index_right];}); 그러나 이것은 다음과 같은 에러를 내게합니다 :'member "SEP :: ratio"는 변수가 아닙니다. " – Tryer

+1

멤버 변수의 경우, [this] (int index_left, int index_right)와 같이'this' 포인터를 포착 할 수 있습니다.) {...}; 'https://stackoverflow.com/questions/7895879 –

+0

을 참조하십시오. 그것은 실제로 문제를 해결했습니다! – Tryer