2012-07-23 2 views
0

기본 클래스 Shape 및 기타 파생 클래스 Circle, SquareTriangle이 있습니다. 3 개의 기본 클래스 포인터 벡터를 만들었습니다.C++에서 개체의 입력 배열 정렬

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

그 후, 가상 함수 draw()

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

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

각 파생 클래스 각 도형의 면적을 계산하고 결과를 반환하는 함수 getArea()를 갖고 호출 것이라고 virtualViaPointer()에게 전화 loop 사용.

이제 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

+3

람다 함수를 사용하는 것은 C++ 11에서만 지원된다는 사실을 밝히는 것이 좋습니다. – betabandido