2011-08-17 15 views
1

std struct tm 개체를 기반으로 사용자 지정 클래스를 정렬해야합니다. 나는 이것이 정확하게 접근하고 있는지 비교 함수에 대한 몇 가지 제안을 알고 싶습니다. 원래 std::tm의 각 멤버를 (.NET DateTime의 Ticks과 같은) 일부 기본 번호로 변환했지만 과도하다고 생각했습니다. 내가 할std :: tm 정렬 방법

하지 list를 사용하는을 가지고,하지만 난 그래도 list 선호하는 것 Container<MyClass*> 사용할 필요가 없습니다. 메인

class MyClass 
{ 
public: 
    std::tm _datetime; 
    static bool ComparePointers(MyClass*& lhs, MyClass*& rhs); 
}; 

bool MyClass::ComparePointers(MyClass*& lhs, MyClass*& rhs) 
{ 
    // ?? 
} 

:

int main() 
{ 
    std::list<MyClass*> classes; 
    MyClass* class_1 = new MyClass(); classes.push_back(class_1); 
    MyClass* class_2 = new MyClass(); classes.push_back(class_2); 
    MyClass* class_3 = new MyClass(); classes.push_back(class_3); 

    list.sort(MyClass::ComparePointers); 
} 
+0

원시 포인터? 오우 치. – Puppy

+0

'MyClass * class_1(); classes.push_back (class_1);'질문의 일부는 아니지만 이것이 틀렸다는 것을 확신합니다. 어쩌면 당신은'MyClass * class_1 = new MyClass(); classes.push_back (class_1); ' –

+0

네, 그게 제가 의미하는 바입니다. 고마워요. 질문을 바꾸 겠어요. – user807566

답변

3

mktime을 사용하면 std::tm 값을 time_t 값으로 변환하여 비교할 수 있습니다.

2

가장 간단한 해결책은 적분 값에 std::tm 인스턴스로 변환하는 등의 에포크 초로. ComparePointers 함수의 두 객체 모두에 대해이 작업을 수행 한 다음 값을 비교합니다.

또 다른 더 복잡한 방법 등 그런데

년, 월, 일, 분, 같이 std::tm의 각 멤버를 비교하는 것입니다, 비교 함수는 잘못된 이름입니다. 포인터는 비교하지 않고 시간과 날짜 값을 비교합니다.

+0

이름이 괜찮다고 생각합니다. 그것은 * 포인터를 비교하지만 * 데이터가 가리키는 시간/날짜의 관점에서 비교를 정의하며, 주소에 대해서만 신경 쓰이는'std :: less '에 의해 제공된 "기본"포인터 비교와는 대조적이다. 포인터들 사이에 하나의 비교 만 정의한다면, 당신은 그것을 ComparePointers라고 부르는 사치를가집니다. 두 개 이상을 정의한다면'ComparePointersByTime','ComparePointersByWeight' 등이 필요할 것입니다. –

+0

변수 초기화 중에 이것을해야만 정렬 중에 반복해서 계산되지 않아야합니까? – user807566

관련 문제