2017-12-17 6 views
1

문자열 벡터를 정렬하기 위해 C++을 작성했습니다. 문자열은 길이에 따라 정렬되어야합니다. 길이가 동일한 경우는 사전 순으로 분류 : 예 : ABC < ABD 여기 내 코드 :C++의 정렬 문자열 벡터

static bool sort_find(string& a, string& b){ 
     if(a.size() < b.size()){ 
      return true; 
     } 
     else if(a.size() > b.size()){ 
      return false; 
     } 
     else{ 
      for(int i=0;i<a.size();i++){ 
       if(a[i] == b[i]) 
        continue; 
       else if(a[i] < b[i]){ 
        return true; 
        } 
       else{ 
        return false; 
       } 
      } 
      return true; 
     } 
    } 

int main(){ 

string array[13]={"m","mo","moc","moch","mocha","l","la","lat","latt","latte","c","ca","cat"}; 

vector<string> svector(array,array+13); 
sort(svector.begin(),svector.end(),sort_find); 
return 0; 
} 

코드의 출력 [C, L, m, CA, LA, moch, mo, cat, lat, moc, latt, mocha, latte] 결과가 나에게 이해가되지 않는다.

누구나 환영합니다!

감사합니다.

답변

1

처음에는 괜찮다고 생각했습니다. 그것은 나를 위해 일했습니다. 그러나 그것은 순수한 행운이었다.

당신은, 표준 : 일종의을보고, 당신이 그것을 요구 모두에 대한

포함, 엄격한 약한 주문해야합니다 것을 발견 할 것이다 http://en.cppreference.com/w/cpp/concept/Compare에 비교 기능에 대한 요구 사항에 대한 링크를 따르십시오 comp (a, a) == false

두 문자열이 같으면 true를 반환합니다. 이것은 당신이 연산자보다 덜 정의하는 것처럼 의미가 없습니다. 이것은 엄격한 약한 순서를 예상하는 std 알고리즘 및 데이터 구조에서 예기치 않은 동작을 초래합니다.

문제를 해결하려면 길이가 동일하면 std :: string에 이미 사전 식 비교가 있으므로 < b를 반환하는 것이 좋습니다.

bool compare_length_then_string_lt(const string& a, const string& b) { 
    if (a.size() < b.size()) 
     return true; 
    else if (a.size() > b.size()) 
     return false; 
    else 
     return a < b; 
} 

std::sort(svector.begin(), svector.end(), compare_length_then_string_lt); 

하지만 거의 잊어 버렸습니다. 두 개의 구조체를 비교하기 위해 여러 가지 다른 방법을 결합 할 때 종종 std :: tuple 또는 std :: tie를 사용할 수 있습니다. std :: tie는 비교를 올바르게 연결하는 방법을 이미 알고 있습니다. 순서를 비교할 구성 요소를 알려주고 나머지는 알아서 처리합니다.

std::sort(svector.begin(), svector.end(), 
    // lambda notation 
    [](const std::string &lhs, const std::string &rhs) { 
     // comparator body 
     return std::make_tuple(lhs.size(), lhs) < std::make_tuple(rhs.size(), rhs); 
    } 
); 
+0

감사합니다. 그것은 나를 위해 일합니다! –