2016-11-06 4 views
0

파일의 텍스트를 사전 순으로 정렬하고 싶지만 사전 편집 순서가 실제로 무엇인지 이해하는 데 문제가 있습니다.문자열의 사전 식 비교 [대소 문자 구별 없음]

문자열을 정렬하면 다른 문제가 발생합니다. 관계 연산자는 ASCII 값을 사용하므로 참일 때

betty < Diane이 거짓이됩니다.

은 샘플 목록을 고려 베티, 다이앤, 123, 아나가, 메건, 찰스, 둘,

(12)가 어떻게 사전 식 순서가 설정 한 것입니까?

+0

생각보다 쉽습니다. ['std :: string'] (http://en.cppreference.com/w/cpp/string/basic_string)는 이미 사전 비교를 사용하고 있습니다. –

+0

그게 무슨 뜻이야? @ someprogrammerdude – FastKid12

+0

STL을 사용하여 작업을 쉽게 수행하는 대신 학습하려는 경우 자신의 기수 정렬을 구현해보십시오. –

답변

1

원하는 것을 수행하지 않습니까?

#include <iostream> 
#include <vector> 
#include <string> 
#include <algorithm> 
#include <cctype> 

int main() { 
    std::vector<std::string> v {"Diane", "123", "Ana", "Megan", "charles", "two", "12"}; 

    for (const auto& s : v) { 
    std::cout << s << ' '; 
    }; 
    std::cout << '\n'; 

    std::sort(v.begin(), v.end(), [](const std::string& a, const std::string& b) { 
    for (int i = 0 ; i < std::min(a.size(), b.size()) ; i++) { 
     const auto a_char = std::tolower(a[i]); 
     const auto b_char = std::tolower(b[i]); 
     if (a_char != b_char) { 
     return a_char < b_char; 
     } 
    } 
    return a.size() < b.size(); 
    }); 

    for (const auto& s : v) { 
    std::cout << s << ' '; 
    }; 
    std::cout << '\n'; 

    return 0; 
} 

표준 출력은 다음과 같습니다

Diane 123 Ana Megan charles two 12 
12 123 Ana charles Diane Megan two 
+0

흠 나를 위해 작동하지 않습니다 – FastKid12

+0

이것은 잘못되었습니다. 대소 문자를 구분하지 않습니다. 전체 질문을 읽으십시오. –

2

접근 :

  1. 사용 map <convert_to_lower_case(words) as string, index as integer> 목록에있는 모든 단어를 넣어.
  2. 는 그 후 사용하여 정렬 된 벡터 myVec을 만듭니다

    for(it_type iterator = m.begin(); iterator != m.end(); iterator++) { myVec.push_back(original_list[it->second]); }

myVec 당신이 찾고있는 사전 식 정렬 된 목록입니다. 당신은 convert_to_lower_case(word)를 구현해야합니다

for(int i = 0; str[i]; i++){ 
    word[i] = tolower(str[i]); 
} 

다른 대답이 너무 좋은, 벡터를 정렬하는 비교기를 사용합니다.