STL使用抽象类排序

时间:2009-11-06 06:48:28

标签: c++ stl

我在使用STL排序函数对派生类进行排序时遇到问题。

示例 -

标题:

vector<AbstractBaseClass *> *myVector;  

在ImpL中:

sort(myVector->begin(), myVector->end(), compareBy);

比较器:

bool MyClass::compareBy(AbstractBaseClass& a, AbstractBaseClass& b) {
    return (a->someMethod() < b->someMethod());
}

编辑:这个问题适用于使用STL排序抽象类的一般用法(我没有发布跟踪转储)。如果它已经不明显了,我会说它没有办法可以编译为打印。相反,我问(给定数据结构)人们通常会如何对这个玩具抽象类进行排序。

感谢您的快速解答,我相信你们已经钉了它们!

Got'a爱StackOverFlow!

2 个答案:

答案 0 :(得分:7)

一个例子:

struct Abstr {
    virtual int some()const == 0;
    virtual ~Abstr() = default;
};

bool abstrSmaller( const Abstr* a1, const Abstr* a2 ) { 
   return a1->some() < a2->some(); 
}

int main() {
   vector<Abstr*> v;

   sort( v.begin(), v.end(), abstrSmaller );
}
  1. 比较函数不应该是成员函数:static或自由函数。
  2. 它应该将vector的元素作为参数,即指针,而不是引用。
  3. 它可以调用const个函数,因此它可以接受const个参数。

答案 1 :(得分:4)

  1. compareBy不能是非静态成员函数(因为这需要编译器将隐式this指针传递给函数)。您可以将其设置为静态成员,自由函数或函数对象。后者通常更好,因为它通常允许更好的优化(尽管在您的代码中,抽象惩罚可能会撤消)。
  2. 比较必须使用向量的value_type,这是AbstractBaseClass*,而不是AbstractBaseClass&
  3. 这将如下所示:

    struct compareBy : public std::binary_function< const AbstractBaseClass*
                                                  , const AbstractBaseClass*
                                                  , bool > {
      bool operator()(const AbstractBaseClass* a, const AbstractBaseClass* b) {
        return (a->someMethod() < b->someMethod());
      }
    };
    

    您还可以将此比较器设置为您的类的私有成员,因此它不会污染任何命名空间。