【问题标题】:C++ STL set custom comparatorC++ STL 设置自定义比较器
【发布时间】:2014-03-22 15:57:14
【问题描述】:

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

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> >*’

如何解决这个问题? 非常感谢!

【问题讨论】:

  • 另请注意,您的CompareLenght(除了有错字)按值输入,这是不必要且低效的。相反,您应该将比较器的签名更改为bool operator()(const std::string&amp; s1, const std::string&amp; s2)

标签: c++ stl set comparator


【解决方案1】:

您传递的 &KeyWord 类型为:

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

到带有参数类型的方法:

std::set<std::string>*

这些类型的区别在于 Get_Word 参数类型中缺少 CompareLenght。您可以将此方法作为模板方法来接受任何类型的关键字,或添加重载方法。或者简单地将 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);
}

【讨论】:

    【解决方案2】:

    你定义的集合为

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

    即关键字的类型是std::set&lt;std::string,CompareLenght&gt; 但函数Get_Word 的参数类型为std::set&lt;std::string&gt; *

    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;
    

    【讨论】:

      猜你喜欢
      • 2021-03-17
      • 1970-01-01
      • 2018-09-07
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多