我在使用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!
答案 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 );
}
static
或自由函数。vector
的元素作为参数,即指针,而不是引用。const
个函数,因此它可以接受const
个参数。答案 1 :(得分:4)
compareBy
不能是非静态成员函数(因为这需要编译器将隐式this
指针传递给函数)。您可以将其设置为静态成员,自由函数或函数对象。后者通常更好,因为它通常允许更好的优化(尽管在您的代码中,抽象惩罚可能会撤消)。 value_type
,这是AbstractBaseClass*
,而不是AbstractBaseClass&
。 这将如下所示:
struct compareBy : public std::binary_function< const AbstractBaseClass*
, const AbstractBaseClass*
, bool > {
bool operator()(const AbstractBaseClass* a, const AbstractBaseClass* b) {
return (a->someMethod() < b->someMethod());
}
};
您还可以将此比较器设置为您的类的私有成员,因此它不会污染任何命名空间。