我有以下比较器用于字符串对象
struct Comparator{
int x;
bool operator() (string a, string b) {
int i = 1;
if(a < b) {
i = -1;
}
i*= x;
if(i==-1) {
return true;
}
return false;
}
};
如您所见,它有一个参数x。当它是= 1时,字符串的比较是正常的,当它是= -1时,比较被反转。
在像sort
这样的vector
元素的方法中使用它时,我可以使用正确的x
给这个比较器的对象实例,但是当我想要给这个比较器模板类如set
,我需要给出一个类而不是一个对象实例。因此,我看到的唯一解决方案是使x
静态。有更好的解决方案吗?
以下是我想使用此比较器的主要示例:
int main(int argc, char** argv)
{
vector<string> vec;
vec.push_back("c");
vec.push_back("a");
vec.push_back("b");
Comparator comp;
comp.x = 1; // for normal comparison
comp.x = -1; // for inverse comparison
sort(vec.begin(),vec.end(), comp); // here I can give the functor instance
for(vector<string>::iterator it = vec.begin() ; it != vec.end(); it++)
{
cout << *it << endl;
}
set<string, Comparator> ss; // but here I must give the name of the functor class
ss.insert("c");
ss.insert("a");
ss.insert("b");
for(set<string>::iterator it = ss.begin() ; it != ss.end(); it++)
{
cout << *it << endl;
}
return 0;
}
答案 0 :(得分:3)
set
的所有相关构造函数也采用Comp
类的实例。
set<string, Comparator> ss(Comparator(-1));
现在,您只需要Comparator
的构造函数,即使用适当的值初始化其成员x
。
也就是说,标准库已经为此目的提供了一个比较器类:
set<string, std::greater<std::string> > ss;
答案 1 :(得分:0)
这不起作用:a&lt; b不(!)表示b <一个。
您可以使用std :: string :: compare:
bool operator() (const std::string& a, const std::string& b) {
int result = a.compare(b) * x;
return result < 0;
}