2012-07-23 45 views
0

我有一个基类Shape和其它派生类CircleSquareTriangle。我创建了三个基类指针的向量。排序对象的输入阵列中的C++

vector < Shape * > shapes(3); 
shapes[ 0 ] = &C1; //Circle C1; 
shapes[ 1 ] = &S1; //Square S1; 
shapes[ 2 ] = &T1; //Triangle T1; 

之后,我使用的loop调用virtualViaPointer()将调用虚拟函数draw()

for (size_t i = 0; i < shapes.size(); ++i) { 
    cout << endl; 
    virtualViaPointer(shapes[ i ]); 
} 

void virtualViaPointer(const Shape * const baseClassPtr) 
{ 
baseClassPtr->draw(); 
} 

每个派生类具有如下功能:getArea(),计算每一形状的区域并返回结果。

现在,我想通过使用上面的vector来排序区域,并调用getArea()函数。我怎样才能做到这一点? 例如,我的排序函数应该是这样的sortShape(Array, numShape),其中Array是指向创建的形状的指针的数组Shape

任何帮助理解

回答

3

可以使用std::sort用合适的比较函数:

bool compareArea(const Shape* lhs, const Shape* rhs){ 
    return lhs->getArea() < rhs->getArea(); 
} 

... 

std::sort(shapes.begin(), shapes.end(), compareArea); 
1

使用排序算法与用户定义的分类准则,例如

std::sort(shapes.begin(), shapes.end(), [](Shape * lhs, Shape * rhs) 
{ 
    return lhs->getArea() < rhs->getArea(); 
}); 
+0

这是很酷,但请注意,它需要一个现代的编译器。 – Kos 2012-07-23 09:48:36

+3

这将是很好的陈述,使用lambda函数只支持C++ 11。 – betabandido 2012-07-23 09:48:55