#include #include // абстрактный класс class Triad { public: float values[3]; virtual void incA() = 0; virtual void incB() = 0; virtual void incC() = 0; bool compare(Triad *t) { return (values[0] + values[2] + values[3]) < (t.values[0] + t.values[2] + t.values[3]); } } class Time : public Triad { // indexes const unsigned int seconds = 0; const unsigned int minutes = 1; const unsigned int hours = 2; Time () { values[seconds] = 0; values[minutes] = 0; values[hours] = 0; } virtual void incA() { if (values[seconds] >= 59) { values[seconds] = 0; incB(); } else values[seconds] ++; } virtual void incB() { if (values[minutes] >= 59) { values[minutes] = 0; incC(); } else values[minutes] ++; } virtual void incC() { if (values[hours] >= 23) values[hours] = 0; else values[hours] ++; } } class Date : public Triad { const unsigned int day = 0; const unsigned int month = 1; const unsigned int year = 2; Date () { values[day] = 1; values[month] = 1; values[year] = 1900; } virtual void incA() { // для упрощения примем количество дней в месяце всегда равным 30 if (values[day] >= 30) { values[day] = 1; incB(); } else values[day] ++; } virtual void incB() { if (values[month] >= 12) { values[month] = 1; incC(); } else values[month] ++; } virtual void incC() { values[year] ++; } } struct pair { Triad *time; Triad *date; }; class Memories { public: std::vector pairs; Memories(unsigned int pairs_count) { pair p; for(unsigned int i = 0; i < pairs_count; i++) { p.time = new Time; p.date = new Date; // присваиваем случайные значения симулируя реальные данные p.time.values[0] = rand() % 60; p.time.values[1] = rand() % 60; p.time.values[2] = rand() % 24; p.date.values[0] = rand() % 30; p.date.values[1] = rand() % 12; p.date.values[2] = 1900 + rand() % 200; // 1900 - 2100 pairs.push_back(&pair); } } pair *getLatest() { pair *latest = NULL; for (unsigned int i = 0; i < values.size(); i++) { if (latest == NULL) { latest = &values[i]; continue; } if(!latest->date.compare(values[i].date)) { if(!latest->time.compare(values[i].time)) { latest = &values[i]; } } } return latest; } pair *getEarlier() { pair *earlier = NULL; for (unsigned int i = 0; i < values.size(); i++) { if (earlier == NULL) { earlier = &values[i]; continue; } if(earlier->date.compare(values[i].date)) { if(earlier->time.compare(values[i].time)) { earlier = &values[i]; } } } return earlier; } } #define PAIRS_TEST_COUNT 1000 int main(int argc, char *argv[]) { Memories m(PAIRS_TEST_COUNT); pair *e = m.getEarlier(); printf("earlier: %d-%d-%d %d:%d:%d\n", e.date.values[2], e.date.values[1], e.date.values[0], e.time.values[2], e.time.values[1], e.time.values[0]); pair *l = m.getLatest(); printf("latest: %d-%d-%d %d:%d:%d\n", l.date.values[2], l.date.values[1], l.date.values[0], l.time.values[2], l.time.values[1], l.time.values[0]); return 0; }