2010-03-12 21 views
19

Ben struct öğeleri içeren azalan sırada bir listesini (bir sınıfın parçası) sıralamak için çalışıyorum, ama derlemek değildir:Liste sıralama kullanarak STL sıralama işlevi

error: no match for 'operator-' in '__last - __first'

sort(Result.poly.begin(), Result.poly.end(), SortDescending()); 

Ve burada SortDescending var:

struct SortDescending 
{ 
    bool operator()(const term& t1, const term& t2) 
    { 
     return t2.pow < t1.pow; 
    } 
}; 

kimse neyin yanlış olduğunu söyleyebilir misiniz?

+0

@Glen http://stackoverflow.com/questions/2425452/polynomial-operations-using-operator-overloading adresine bakın. – Vlad

cevap

33

bulundunuz std::list değişiklik ile çalışmaz std::list<>::iterator s (liste yinelemeler çift yönlü yinelemeler olan) olmayan rasgele erişim yineleyicileri gerektirir.

std::list<>::sort üye işlevini kullanmalısınız.

+0

ama sınıfım için daha az operatöre doğru aşırı yüklenmeyi bilmiyorum – Vlad

+2

@ Vlad, bir şeye aşırı yüklenmeniz gerekmez. Result.poly.sort (SortDescending()); 'sadece iyi çalışması gerekir. – Glen

+1

Karşılaştırıcınızdaki işleç() '*, herhangi bir üyeyi değiştirmediğinden * hala * const olarak işaretlenmelidir. –

10

std::list yerleşik bir sen std::list::iterator sadece Yineleyicilerin çift yönlü yineleyici sınıfa aittir oysa std::sort sadece rasgele erişim adım adım elde çalıştığı için kullanmak gerekir sort yöntemle.

Result.poly.sort(SortDescending()); 

Ayrıca, operator()const işaretlenmelidir.

Result.poly.sort(std::greater<term>()); 
+0

Hayır, bu standartta, bunun const olması gerektiğini söyleyen hiçbir şey yok. Hata mesajına bakarsanız, giriş yineleyicileri için 'operatör' eksik. –

+0

Yeniden düzenlenmişse daha iyi bir yanıt verecekti (buradaki konstrüksiyon bir yan meseledir). – visitor

+0

hala kendi karşılaştırıcım ya da daha büyük() kullanarak hala çalışmıyor hatalar verir – Vlad

4

O Result.poly olduğu için yineleyici türleri gibi görünüyor:

struct SortDescending 
{ 
    bool operator()(const term& t1, const term& t2) const 
    { 
     return t2.pow < t1.pow; 
    } 
}; 

Son olarak, sadece (standart başlığında <functional> bulunur) std::greater<T> kullanın Bunun için kendi karşılaştırıcısı yazmaya gerek yok operator - eksik. std::sort standart algoritma std::sortResult.poly.sort

+0

fakat daha az operatöre doğru aşırı yükü bilmiyorum. – Vlad

+0

@ Vlad sınıfına göre bu bilgiyi 'Result.poly.sort (SortDescending()) ', operatöre gerek yoktur <'. –

+0

@Konrad Ben “operatöründen” bahsettiğini düşünüyorum ve “std :: ist :: sort” türünün bir yüklemi aldığını unutmuştum. –