2014-09-26 5 views
2

길이로 정렬 된 파일에서 읽은 단어 목록을 만들려고합니다. 이를 위해 커스텀 비교기로 std :: set을 사용하려고합니다.std :: set와 함께 사용자 지정 비교기 사용

class Longer { 
public: 
    bool operator() (const string& a, const string& b) 
    { return a.size() > b.size();} 
}; 

set<string, Longer> make_dictionary (const string& ifile){ 
    // produces a map of words in 'ifile' sorted by their length 

    ifstream ifs {ifile}; 
    if (!ifs) throw runtime_error ("couldn't open file for reading"); 

    string word; 
    set<string, Longer> words; 

    while (ifs >> word){ 
    strip(word); 
    tolower(word); 
    words.insert(word); 
} 

remove_plurals(words); 

if (ifs.eof()){  
    return words; 
    } 
    else 
    throw runtime_error ("input failed"); 
} 

이로부터, 나는 그 길이로 정렬 된 파일의 모든 단어 목록을 기대합니다. 대신, 입력에서 발생하는 각각의 길이 단 하나의 단어로, 매우 짧은 목록을 얻을 :

polynomially-decidable 
complexity-theoretic 
linearly-decidable 
lexicographically 
alternating-time 
finite-variable 
newenvironment 
documentclass 
binoppenalty 
investigate 
usepackage 
corollary 
latexsym 
article 
remark 
logic 
12pt 
box 
on 
a 

여기에 무슨 일이 일어나고 있는지의 어떤 생각?

+0

는 [MCVE] (http://stackoverflow.com/help/mcve)로 프로그램 만 * 관련 * 부품을 게시하시기 바랍니다. – Csq

답변

3

비교기를 사용하면 동일한 길이의 단어가 동일하며 집합에 동일한 항목이 중복 될 수 없습니다.

여러 단어를 유지하려면 길이가 동일하면 사전 식 비교도 수행하도록 비교기를 수정해야합니다.

0

비교기는 길이 만 비교합니다. 즉, 동일한 크기이지만 다른 문자열은 std::set으로 처리됩니다. (std::set 취급을 동등하게 a < bb < a도는 < 사용자 정의 비교 함수 인.에,에 해당하는 경우)도 이러한 상황을 방지하기 위해 문자열의 내용을 고려해야합니다 귀하의 비교를 의미

합니다. 이 키워드는 사전 식 비교입니다. 즉, 여러 비교 기준을 고려해야합니다. 첫 번째 기준은 문자열 길이이고 두 번째 기준은 문자열 자체입니다. 사전 편집 비교를 작성하는 쉬운 방법은 operator<을 오버로드하여 구성 요소에 대한 사전 비교를 수행하는 비교 연산자를 제공하는 std::tuple을 사용하는 것입니다.

당신이 operator>으로 쓴 길이의 당신의 "반전"순서를 만들려면 보통 operator< 사용과 호환, 단순히 문자열의 부정적인 크기, 즉 첫 번째 재 작성 -a.size() < -b.size()a.size() > b.size()을 촬영 한 다음 문자열을 구성 자체는 튜플에, 마지막으로 <으로 튜플을 비교 :

class Longer { 
public: 
    bool operator() (const string& a, const string& b) 
    { 
     return std::make_tuple(-a.size(), a) 
      < std::make_tuple(-b.size(), b); 
     //      ^^^^^^^^^ ^^^ 
     //      first second 
     //     criterion criterion 
    } 
}; 
관련 문제