在某些std
库template
的参数中,需要定义他/她自己的函数比较器less(a, b)
,more(a, b)
但是std::some_template<T, *, myComparator()>
为什么呢?
问问题
146 次
3 回答
5
比较器的目的是允许对已排序的 stl 容器中的对象进行排序。如果默认比较器不适用于容器将容纳的对象类型,您只需要提供自己的比较器。
例如,如果您要制作以下 std::set struct
,那么您需要编写自己的比较器。
struct Person
{
std::string first_name, last_name, phone_number;
}
默认比较器知道如何比较数字和字符串,但不知道如何比较 Person 对象。这就是编写自定义比较器以按姓氏对 Person 对象进行排序的方式。
struct Person_Comparator
{
bool operator()(const Person &a, const Person &b) const {
return a.last_name < b.last_name;
}
};
于 2013-07-27T14:29:20.260 回答
1
另一个例子让我们用一些不同的标准来做一个集合
int main()
{
//By default set will use std::less<int>()
//Lets make a set based on no. of 1's in binary representation of elements
set<int,mycomp> s;
for(auto i=1;i<20;i++) //Note :Duplicates 1's representation will be discarded
s.insert(i);
for(auto i:s)
cout<<i<< " "; //19 15 8 7 3 1
return 0;
}
相应的比较器将如下所示:
struct mycomp
{
bool operator()(const int& a, const int& b) const {
auto count_bits = [](long n){
unsigned int c;
for (c = 0; n; c++)
n &= n - 1;
return c;
};
return count_bits(a) != count_bits(b);
}
};
于 2013-07-27T15:16:30.223 回答