2013-05-09 2 views
0

C++에서 lexicographical_compare() 함수를 사용하여 문자열을 정렬 할 수있는 방법이 있습니까?lexicographical_compare() 함수로 정렬

STL 정렬로 할 수 있지만 내 질문은 lexicographical_compare() 함수에 대한 것입니다.

+2

C++의 문자열은 기본적으로 사전 식으로 비교됩니다. ** 정확히 ** 당신이하고 싶은 것에 대한 자세한 정보를 제공하십시오. 몇 가지 예제 입력 및 출력을 제공 할 수도 있습니다. –

+0

"apple", "Apple", "AppLe", "APPLe"등의 문자열이 있다고 가정합시다. 이제는 사전 식으로 정렬하고 싶습니다. –

+0

Sort는 이미 사전 식으로 정렬합니다. –

답변

5

문자열을 정렬하는 데 std::lexicographical_compare이 필요하지 않습니다.

#include <iostream> 
#include <string> 
#include <algorithm> 

int main() 
{ 
    std::string s("qwertyuioplkjhgfdsazxcvbnm"); 
    std::cout << s << "\n"; 
    std::sort(s.begin(), s.end()); 
    std::cout << s << "\n"; 
} 

같은 문자열의 컬렉션을 정렬에 적용 : 문제는 제대로 나가셨입니다

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

int main() 
{ 
    std::vector<std::string> v{"apple" , "Apple" ,"AppLe" , "APPLe"}; 
    for (const auto& s : v) 
    std::cout << s << " "; 
    std::cout << "\n"; 
    std::sort(v.begin(), v.end()); 
    for (const auto& s : v) 
    std::cout << s << " "; 
    std::cout << "\n"; 
} 
+0

나는 이미 STL 정렬로 할 수 있다고 말했지만, 여기 ** lexicographical_compare() ** 함수로 정렬 할 수있는 방법이 있다면 생각했다. –

+0

@StuartJecoroxy 왜 그렇게하고 싶습니까? 정렬은 이미 사전 식으로 수행됩니다. – juanchopanza

+0

사실 나는 기능을 가지고 놀고 싶습니다 ......... –

4

당신은 방금 std::sort 알고리즘이 필요합니다. 물론 std::lexicographical_compare은 아무 것도 수정하지 않으므로 정렬하려면 std::lexicographical_compare을 사용할 수 없습니다. 어쨌든 std::sort (또는 이에 상응하는 것)을 사용해야합니다. "에 대한 정답 방법 operator<std::string에서의이 사전 편찬 비교이기 때문에 당신이 전적으로 종류 std::string s의 컨테이너가 std::sort(vec.begin(), vec.end())입니다 않습니다. 귀하의 질문에 당신이 종류의 방법을 다양합니까의 폭 넓은 질문의 예입니다 가정에

(당신이 std::sort의 동작을 변경하는 사용자 정의 비교 함수 객체를 사용 어떻게의 문제가 정말 더) 사전 식 순서에 용기를, 당신은 단지 비교 연산자와 std::sort를 제공 예를 들면 다음과 같습니다.

// A function objecto to do lexicographical comparisons 
template <typename Container> 
bool LexCompare(const Container& a, const Container& b) { 
    return std::lexicographical_compare(a.begin(), a.end(), 
             b.begin(), b.end()); 
} 

// Use that comparison function to sort a range: 
template <typename ContainerIterator> 
void sort_by_lexicographical_comapre(ContainerIterator beg, 
            ContainerIterator end) 
{ 
    std::sort(beg, end, LexCompare<typename ContainerIterator::value_type>); 
} 


int main() { 
    std::vector<std::string> v; 
    v.push_back(std::string()); 
    v[0].push_back('1'); 
    v[0].push_back('3'); 
    v[0].push_back('0'); 
    v.push_back(std::string()); 
    v[1].push_back('1'); 
    v[1].push_back('3'); 
    sort_by_lexicographical_comapre(v.begin(), v.end()); 

    for (int i = 0; i != v.size(); ++i) { 
     std::cout << v[i] << "\n"; 
    } 
    return 0; 
} 

에게 당신을 위의 내용을 v (으)로 변경할 수 있습니다. 유형이 std::vector<std::vector<int> >이고 정수를 푸시 백으로 푸시하면 여전히 작동합니다.

관련 문제