繁体   English   中英

自定义排序和映射时,首选函数指针还是函数对象?

[英]Prefer function-pointer or function-object when customizing sort and map?

我想在C ++中自定义排序模板和地图模板

这里是为了比较,

struct Greater1
{
    bool operator() (string A, string B)
    {
        string AB = A + B;
        string BA = B + A;
        return (AB >BA);
    }
};

static bool Greater2(string A, string B)
{
    string AB = A + B;
    string BA = B + A;
    return (AB >BA);
}

经过我的测试,Greater1适用于地图,Greater2适用于排序。 我还从CPLUSPLUS获得了一些信息,发现和map都应同时使用函数指针和函数对象。 我的问题是,为什么Greater2可以用于地图,而Greater1可以用于排序。

std::sort接受Compare对象的实例,而类模板std::map允许您指定Compare的类型。 您可能试图使用类型如下的Greater1

sort(beginIt, endIt, Greater1);

这是不正确的。 您应该将其用作

sort(beginIt, endIt, Greater1());

但是,由于Greater2是函数指针而不是类型名称,

sort(beginIt, endIt, Greater2);

工作正常。

使用std::map ,您需要提供一个类型。 因此,您需要使用Greater1类的Greater1 您还可以使用std :: map构造函数 ,该构造函数允许您指定Compare对象和一些模板魔术,最终使用Greater2如下所示:

template <typename Key, typename Value, typename Compare>
std::map<Key, Value, Compare> make_map(Compare const& comp)
{
 return std::map<Key, Value, Compare>(comp);
}

现在,您可以制作这样的地图:

auto myMap = make_map<std::string, std::string>(Greater2);

为了与std::map交换函数对象和指针,您需要为函数指针指定类型,如下所示

typedef std::function< bool(string,string)> compare;

然后,

std::map<string, string, compare >  m(Greater2) ; 

对于std::sort

sort(beginIt, endIt, Greater1() ); // since Greater1 is type

要么

sort(beginIt, endIt, Greater2 );  

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM