2016-03-28 17 views
0

QList'den Qsort çağrısı, 2 sütun üzerinde sıralama yapmak için işe yaramaz. Bu durumda, QList alt sınıfını ve sıralama düzenini belirlemek için “karşılaştır” işlevini çağıran bir Quicksort yöntemi eklemek istiyorum.Subclass QList for Quicksort

Qt'ye yeni olmak (temel olarak Delphi) Kodu uygulamada sorun yaşıyorum.

//prototype 
#define TComp = int compare(pointer1, pointer2); 

int MyComp(p1, p2) 
{ 
    if  (p1.x < p2.x) return –1 
    else if (p1.x > p2.x) return 1 
    else if (p1.y < p2.y) return –1 
    else if (p1.y > p2.y) return 1 
    else     return 0 
} 

class TObjList : public QList 
{ 
public: 
    void mySort(MyComp); 
private: 
    void QuickSort(TComp MyComp); 
}; 

Bu büyük sormak, ama bu aşamada ihtiyaç: Aşağıdakilerin gerekli kod “kavramını” ifade umuyoruz.

cevap

1

ben yapmazdım burada bazı şeyleri vardır:

  1. QList gibi bir kap tipi anlam ifade etmiyor sınıflara, bu yeniden uygulamaya sanal yöntemleri olduğu gibi. Sadece yardımcı işlev eklemek alt sınıflamayı haklı çıkarmaz, ücretsiz bir işlev haline getirir.
  2. Std :: sort gibi genel bir işlev yerine sıralamayı üye işlevi olarak uygulayın.
  3. sadece kendi karşılaştırma operatörü almak için tüm sıralama algoritması reimplement kullanılan
C++ 11 (std :: çeşit ve özel karşılaştırma işlevi kullanmak için öneririm

, bu bir lambda kullanabilirsiniz veya std :: burada yapılan sözcükbilimsel karşılaştırmayı uygulayan tuple): örneğin,

template <typename T> 
bool xyLessThan(const T &lhs, const T &rhs) 
{ 
    if (lhs.x == rhs.x) 
     return lhs.y < rhs.y; 
    return lhs.x < rhs.x; 
} 

Ve sonra Eğer işlevini belirtmek bakalım genel sıralama algoritması kullanır

QList<Point> points; 
... 
std::sort(points.begin(), points.end(), &xyLessThan); 

burada xyLessThan olan karşılaştırma için kullanılacak.

Eğer elemanları (QList T) sınıfını kontrol etmek ve varsa “doğal” sıralama, böyle bir operator< ekleyebilirsiniz:

sonra
bool Point::operator<(const Point &other) const 
{ 
    if (x == other.x) 
     return y < other.y; 
    return x < other.x; 
} 

sadece yapabileceği

std::sort(points.begin(), points.end()); 
+0

İlginç ve ilgili bir yanıt için teşekkürler. İçeriği tüketip size geri bahse girmem biraz zaman alacak. Tekrar teşekkürler. – Glen