2

此代码可与 g++ 4.4 和“-std=c++0x”一起正常编译。

#include <unordered_set>

namespace
{

size_t IntHash ( int i )
{
    return i;
}

bool IntComp ( int i, int j )
{
    return i == j;
}

}

int main ( int argc, char* argv[] )
{
    typedef std::pointer_to_unary_function<int, size_t> CustomHash;
    typedef std::pointer_to_binary_function<int, int, bool>
        CustomComp;

    typedef std::unordered_set<int, CustomHash, CustomComp> DeprecatedSet;

    DeprecatedSet deprecatedSet ( 10, std::ptr_fun ( IntHash ), std::ptr_fun ( IntComp ) );

    deprecatedSet.insert ( 5 );
    deprecatedSet.insert ( 10 );
}

但是,说,我不想使用已弃用的 std::pointer_to_unary_function 和 std::ptr_fun,但仍然使用免费函数:

#include <unordered_set>
#include <functional>

namespace
{

size_t IntHash ( int i )
{
    return i;
}

bool IntComp ( int i, int j )
{
    return i == j;
}

}

int main ( int argc, char* argv[] )
{
    typedef std::unordered_set<int /*, UserDefinedHash?, UserDefinedComparison? */> NewSet;

    NewSet newSet (
        10,
        std::bind ( IntHash, std::placeholders::_1 ),
        std::bind ( IntComp, std::placeholders::_1, std::placeholders::_2 ) );

    newSet.insert ( 5 );
    newSet.insert ( 10 );
}

这不会编译,我假设是因为我不确定要为UserDefinedHashUserDefinedComparison输入什么。

看起来 std::bind 没有定义绑定对象本身类型的成员类型。

我知道还有其他方法可以定义自定义哈希函数和比较,只是好奇是否可以在不弃用标准库类型和函数的情况下使用免费/类函数。

4

3 回答 3

10

您可以使用:

std::unordered_set<int, size_t(*)(int), bool(*)(int, int)> my_set;
my_set s( 10, &IntHash, &IntComp );

为了使用std::bind,您可以使用decltypestd::function

于 2012-10-25T21:18:30.747 回答
1

std::function是 等的替代品std::pointer_to_unary_function

typedef std::unordered_set<int, 
                std::function<size_t(int)>,
                std::function<bool(int,int)>> NewSet;

所有这些仿函数已被std::function. (尽管如评论等中所述,常规函数指针在这里更可取,因为std::function它旨在存储任何类型的可调用实体)。

于 2012-10-25T21:22:40.680 回答
1

绑定对象可以存储在std::function

typedef std::unordered_set<int,
    std::function<size_t(int)>, std::function<bool(int, int)>> NewSet;

NewSet newSet (
    10,
    std::bind ( IntHash, std::placeholders::_1 ),
    std::bind ( IntComp, std::placeholders::_1, std::placeholders::_2 ) );
于 2012-10-25T21:25:30.310 回答