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;