보다 복잡한 데이터 타입의 벡터 정렬하기
만약 여러분이 다중의 변수를 가지는 오브젝트를 정렬하려고 한다면, 복잡한 일일 것입니다. ofSort(...)에 boolean 함수를 사용하면, ofSort에게 어떻게 정렬할 것인지 알려줄 수 있습니다.
간단한 예제를 살펴봅시다 -- 우선, ofApp의 맨 상단에 오브젝트를 하나 정의합니다(이때 ofApp은 아마도 별도의 파일로 구성할수도 있겠죠..). 또한 sortMe라는 boolean 함수를 정의합니다. 이 sortMe 함수는 오브젝트를 가리키는 레퍼런스 두개를 취하여 비교한 뒤 b 잎에 위치해야 한다면 true를 리턴합니다. 이 예제에서는 나이로 정렬(오름차순) 할 것입니다만, 다른 속성으로 정렬할 수도 있습니다.
#include "ofApp.h"
// 정렬을 하기 위한 정보를 갖고 있는 오브젝트를 생성합니다.
class myObject {
public:
float age;
int id;
};
// ofSort에게 두 아이템을 어떻게 비교할것인지 알려주는 boolean 함수
bool sortMe(myObject & a, myObject & b){
if (a.age < b.age){
return true;
} else {
return false;
}
}
//--------------------------------------------------------------
void ofApp::setup(){
// 세 개의 오브젝트에 다른 정보를 입력합니다.
myObject a;
myObject b;
myObject c;
a.id = 0;
b.id = 1;
c.id = 2;
a.age = 100;
b.age = 1000;
c.age = 5;
// 이것들을 벡터에 넣습니다.
vector < myObject > objects = {a,b,c};
// 정렬되기 전 내용을 출력합니다.
cout << "pre sort" << endl;
for (int i = 0; i < objects.size(); i++){
cout << objects[i].id << " " << objects[i].age << endl;
}
ofSort(objects, sortMe);
// 정렬된 후의 내용을 출력합니다.
cout << "post sort" << endl;
for (int i = 0; i < objects.size(); i++){
cout << objects[i].id << " " << objects[i].age << endl;
}
}
코드를 실행하면, 아래와 같은 결과를 얻을 수 있습니다.
pre sort
0 100
1 1000
2 5
post sort
2 5
0 100
1 1000
여기서 boolean함수를 변경할수 있다는 사실에 주목해주세요 -- 예를들어 내림차순으로 오브젝트를 정렬하기 위해서는 위의 예제에서 < 를 > 로 바꿔주면 됩니다 :
bool sortMe(myObject & a, myObject & b){
if (a.age > b.age){
return true;
} else {
return false;
}
}