C++ C++;自定义比较器

C++ C++;自定义比较器,c++,stl,set,comparator,C++,Stl,Set,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&

我在用自定义比较器排序一组字符串时遇到问题。 我会根据绳子的长度来订购

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;
}
struct CompareLenght
{
布尔运算符()(常数std::string s1,常数std::string s2)常数
{return(s1.size()>s2.size());}
}
类搜索引擎
{
私人:
无效关联(const std::vector&Files);
公众:
搜索引擎(const std::vector和Files);
无效搜索(常量std::string&frase,std::set*S);
};
FindWord类
{
私人:
性病:假释;
公众:
FindWord(const std::string和str);
内联void Get_Word(std::set*set_Of_Word);
};
内联void FindWord::Get_Word(std::set*set_Of_Word)
{  
*单词集合=假释;
}
当我尝试这样做时,问题来了:

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
}
void SearchEngine::Search(常量std::字符串和短语,std::set*S)
{
芬德沃德F(短语);
std::set关键字;
F.获取单词和关键字;
//一些代码
}
错误是:

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> >*’
在main.cc:15:0中包含的文件中:
SearchEngineNew.cc:在成员函数“void SearchEngine::Search(const string&,std::set*)”中:
SearchEngineNew.cc:69:33:错误:调用“FindWord::Get_Word(std::set*)”时没有匹配的函数
F.获取单词和关键字;
^
SearchEngineNew.cc:69:33:注:候选人是:
在main.cc中包含的文件中:14:0:
cc:39:13:注意:void FindWord::Get_Word(std::set*)
内联void FindWord::Get_Word(std::set*set_Of_Word)
^
FindWord.cc:39:13:注意:参数1从'std::set*'到'std::set*'的转换未知
如何解决这个问题?
多谢各位

您正在传递类型为的&关键字:

std::set<std::string,CompareLenght> Keyword;
std::set关键字;
要使用类型为的参数创建方法,请执行以下操作:

std::set<std::string>*
std::set*
这些类型的区别在于Get_Word参数类型中缺少CompareLenght。您可以将此方法作为模板方法来接受任何类型的关键字,或者添加重载方法。或者简单地将Get_Word更改为:

inline void Get_Word(std::set<std::string,CompareLenght> *Set_Of_Word); 
                                          ^^^^^^^^^^^^^
inline void Get_Word(std::set*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);
}
typedef std::set\u type;
for(set_type::const_iterator citr=Parole_Univoche.begin();citr!=Parole_Univoche.end();++citr){
设置单词的字母->插入(*citr);
}
您将集合定义为

std::set<std::string,CompareLenght> Keyword;
也是数据成员

std::set<std::string> Parole_Univoche;
std::设定假释;
也应定义为

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

还要注意的是,您的
CompareLenght
(除了输入错误之外)按值进行输入,这是不必要的,也是低效的。相反,您应该将比较器的签名更改为
bool操作符()(const std::string&s1,const std::string&s2)
*Set_Of_Word = Parole_Univoche;
std::set<std::string> Parole_Univoche;
std::set<std::string, CompareLenght> Parole_Univoche;