簡體   English   中英

C ++ STL設置自定義比較器

[英]C++ STL set custom comparator

我在通過自定義比較器排序一組字符串時遇到問題。 我會根據字符串的長度排序。

struct CompareLenght
{
    bool operator()(const std::string s1, const std::string s2) const
    {return (s1.size()>s2.size());}        
}

class SearchEngine
{
    private:
    void Associate(const std::vector<std::string> &Files);
    public:   
    SearchEngine(const std::vector<std::string> &Files);  
    void Search(const std::string &frase, std::set<std::string> *S);
};

class FindWord
{
    private:
    std::set<std::string> Parole_Univoche; 
    public:  

    FindWord(const std::string &str);
    inline void Get_Word(std::set<std::string> *Set_Of_Word); 
};

inline void FindWord::Get_Word(std::set<std::string> *Set_Of_Word)
{  
    *Set_Of_Word = Parole_Univoche;
}

當我嘗試這樣做時,問題就來了:

void SearchEngine::Search(const std::string &phrase, std::set<std::string> *S)
{
    FindWord F(phrase);                             
    std::set<std::string,CompareLenght> Keyword;             
    F.Get_Word(&Keyword);   
    // some code
}

錯誤是:

In file included from main.cc:15:0:
SearchEngineNew.cc: In member function ‘void SearchEngine::Search(const string&, std::set<std::basic_string<char> >*)’:
SearchEngineNew.cc:69:33: error: no matching function for call to ‘FindWord::Get_Word(std::set<std::basic_string<char>, cmp>*)’
              F.Get_Word(&Keyword);       
                                 ^
SearchEngineNew.cc:69:33: note: candidate is:
In file included from main.cc:14:0:
FindWord.cc:39:13: note: void FindWord::Get_Word(std::set<std::basic_string<char> >*)
 inline void FindWord::Get_Word(std::set<std::string> *Set_Of_Word)
             ^
FindWord.cc:39:13: note:   no known conversion for argument 1 from ‘std::set<std::basic_string<char>, cmp>*’ to ‘std::set<std::basic_string<char> >*’

如何解決這個問題? 非常感謝你!

您正在傳遞&KeyWord類型:

std::set<std::string,CompareLenght> Keyword;

參數類型的方法:

std::set<std::string>*

這些類型的區別在於Get_Word參數類型中缺少CompareLenght。 您可以將此Mathod作為模板方法來接受任何類型的KeyWord,或添加重載方法。 或者只是將Get_Word更改為:

inline void Get_Word(std::set<std::string,CompareLenght> *Set_Of_Word); 
                                          ^^^^^^^^^^^^^

但是您隨后必須將此更改傳播到Parole_Univoche或手動復制Set_Of_Word,如下所示:

typedef std::set<std::string> set_type;
for ( set_type::const_iterator citr = Parole_Univoche.begin(); citr != Parole_Univoche.end(); ++citr ) {
    Set_Of_Word->insert(*citr);
}

您定義為

std::set<std::string,CompareLenght> Keyword;

那是關鍵字的類型是std::set<std::string,CompareLenght>但是函數Get_Word的參數類型是std::set<std::string> *

inline void FindWord::Get_Word(std::set<std::string> *Set_Of_Word)
           {  *Set_Of_Word = Parole_Univoche;} 

按以下方式更改

inline void FindWord::Get_Word(std::set<std::string, CompareLenght> *Set_Of_Word)
           {  *Set_Of_Word = Parole_Univoche;} 

而且似乎該功能應定義為

inline void FindWord::Get_Word(std::set<std::string, CompareLenght> *Set_Of_Word)
           {  Parole_Univoche = *Set_Of_Word; }

因為作業沒有任何意義

*Set_Of_Word = Parole_Univoche;

也是數據成員

std::set<std::string> Parole_Univoche;

也應定義為

std::set<std::string, CompareLenght> Parole_Univoche;

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM