代码之家  ›  专栏  ›  技术社区  ›  Searock

为什么这个程序要重载()运算符?

  •  4
  • Searock  · 技术社区  · 16 年前

    在这个程序中,我将一些长值存储在关联容器中,然后根据单元的位置(根据单元位置中的数字)对它们进行排序。

    代码:

    #include <iostream>
    #include <set>
    #include <functional>
    
    using namespace std;
    
    class UnitLess
    {
    public:
        bool operator()(long first, long second)
        {
            long fu = first % 10;
            long su = second % 10;
    
            return fu < su;
        }
    };
    
    typedef set<long, UnitLess> Ctnr;
    
    int main(void)
    {
        Ctnr store;
    
        store.insert(3124);
        store.insert(5236);
        store.insert(2347);
        store.insert(6415);
        store.insert(4548);
        store.insert(6415);
    
        for(Ctnr::iterator i = store.begin(); i != store.end(); ++i)
        {
            cout << *i << endl;
        }
    }
    

    谢谢。

    3 回复  |  直到 13 年前
        1
  •  7
  •   Macke    16 年前

    它是作为一个函子实现的,即允许在对象上使用函数运算符(这就是std::set在引擎盖下面所做的)。这样做是STL和类似代码调用自定义对象的常见方法。(函数指针比函数对象(也称为函子)更受限制)

    Unitless functor;
    
    functor(123, 124); // returns true or false
    

    set是一个已排序的二叉树,因此它在每次插入时多次调用Unitless的()运算符,以确定每个长值应该去哪里。

    • 然后你就习惯了,到处都用,因为它们很整洁。
    • 然后你的代码又变得可怕和混乱,你像躲避瘟疫一样避开它们。
    • 然后你成为了一名管道胶带程序员,只在适当的地方使用它们,而不是在其他地方。

        2
  •  7
  •   Björn Pollex    16 年前

    UnitLess 是一个 binary predicate ,在STL中必须是具有两个参数的可调用的。

    无单位 这种类型的实例可以像使用两个 longs 并返回 bool

    UnitLess f;
    f(5, 10);
    

    bool f(long first, long second)
    {
        long fu = first % 10;
        long su = second % 10;
    
        return fu < su;
    }
    f(5, 10);
    
        3
  •  2
  •   CashCow    16 年前

    他实现了一个用于std::set的自定义比较,它只比较单元即。数量模10。因为std::set是一个模板,所以它只是尝试调用看起来像函数的东西,不管它是否是函数。通过重载operator()可以使它像函数一样工作。

    在实际的编码示例中,可能有一个小缺陷,因为该练习只是按单位对它们进行排序,但它可以很好地消除具有相同单位但实际上不是重复的数字。在您的示例代码中没有这样的示例(您有一个副本,但这是整个值的副本)。如果在4548之外还有3478,那么集合比较器会认为它们是相同的,不允许重复。

    顺便说一下,我不确定set是什么,我称之为“关联”容器,它指的是键值对。集合中没有关联的值,只有键。

    还有一点:operator()应该是const。