2017-04-25 1 views
-2

를 정렬하는 동안 마지막에 나타납니다 ' 을'I 문자열은 contarting

'aa' 
'hello' 
'start' 
'<1-10>' 
'<cr>' 

내가 C의 정렬 라이브러리를 qsort 사용

, 나는 다음과 같은 출력을 문자열의 다음 세트를 얻을 수있다

<1-10> 
<cr> 
aa 
hello 
start 

하지만 다음 출력을 원합니다.

<1-10> 
aa 
hello 
start 
<cr> 

도움 주셔서 감사합니다.

+1

코드를 제시해주십시오. 우리는 독자들을 신경 쓰지 않고 그것을 보지 않고 무엇이 잘못되었는지를 말할 수 없습니다. 관련 언어 태그 만 사용하십시오. C 및 C++은 다른 언어입니다. – kaylum

+0

C 또는 C++? 그리고 어떤 데이터 구조를 문자열 목록/배열/원시 포인터 배열/벡터/...에 사용 하시겠습니까? –

+0

C, 나는 벡터를 사용하고있다 – deathstroke05

답변

3
  1. <cr>을 포함한 문자열을 다른 컨테이너로 옮깁니다.
  2. 나머지 문자열을 정렬하십시오.
  3. 정렬 <cr>
  4. 를 포함하는 문자열을 보유하는 용기 대신 별도의 용기를 사용하는 사용자가 서비스 종료시 <cr>를 포함하는 문자열을 이동할 수

또한 제리스트의 끝에서 두 번째 컨테이너에 항목을 추가 할 목록 (std::partition)을 입력하고 qsort을 두 하위 배열에 다르게 적용하십시오.

bool partitioner(string str) { 
    return str.find("<cr>") == string::npos; 
} 

그리고 지금은 : vector는 C++ 타입이기 때문에 당신은 아마, 어쨌든 다음 C. 을 사용할 것을 주장하는 반면

vector<string> v {"hello", "world", "<cr>", "<cr>string"}; 
auto bound = partition(v.begin(), v.end(), partitioner); 
sort(v.begin(), bound); 
sort(bound, v.end()); 
0

나는, 실제 설정에 대한 확실하지 않다 std :: vector에 std :: sort와 함께 작성된 코드는 정렬에 대한 사용자 지정 비교 함수를 소개하는 기본 원칙을 보여줍니다. qsort에서도 맞춤 비교 기능을 사용할 수 있지만 구문은 다릅니다.

사용자 지정 비교 함수는 다음과 같이 작동합니다. 두 문자열이 <으로 시작하는 경우 나머지는 비교됩니다. 그 중 하나가 <으로 시작하면이 값은 항상 다른 값보다 아래에 위치합니다. 그렇지 않으면 간단히 비교됩니다. 나는 :-) 당신을 위해 C의 몇 가지 맛을 유지하기 위해 char* - 데이터 유형을 사용 :

int main() { 

    std::vector<const char*> s = { 
     "aa", 
     "start", 
     "hello", 
     "<d-10>", 
     "<cr>" 
    }; 

    // sort using a custom function object 
    struct { 
     bool operator()(const char*a, const char*b) 
     { 
      if (*a == '<') { 
       if (*b == '<') { 
        return strcmp(a+1,b+1) < 0; 
       } 
       else { 
        return false; 
       } 
      } 
      else if (*b == '<') { 
       if (*a == '<') { 
        return strcmp(a+1,b+1) < 0; 
       } 
       else { 
        return true; 
       } 
      } 
      else 
       return strcmp(a,b) < 0; 
     } 
    } customLess; 

    std::sort(s.begin(), s.end(), customLess); 
    for (auto a : s) { 
     std::cout << a << std::endl; 
    } 

    return 0; 
} 

출력 :

aa 
hello 
start 
<cr> 
<d-10>