2010-03-12 54 views
19

Tôi đang cố gắng sắp xếp một danh sách (một phần của một lớp) để chứa các đối tượng có struct giảm dần, nhưng nó không biên dịch:Sắp xếp danh sách sử dụng STL loại chức năng

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

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

Và đây là SortDescending:

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

Bất cứ ai có thể cho tôi biết có vấn đề gì không?

+0

@Glen xem http://stackoverflow.com/questions/2425452/polynomial-operations-using-operator-overloading – Vlad

Trả lời

33

Tiêu chuẩn thuật toán std::sort đòi hỏi lặp truy cập ngẫu nhiên, mà std::list<>::iterator s không (danh sách vòng lặp là lặp hai chiều).

Bạn nên sử dụng chức năng thành viên std::list<>::sort.

+0

nhưng tôi không biết làm thế nào để quá tải chính xác các nhà điều hành ít hơn cho lớp học của tôi – Vlad

+2

@Vlad, bạn không cần phải quá tải bất cứ điều gì. 'Result.poly.sort (SortDescending());' chỉ hoạt động tốt. – Glen

+1

Toán tử '() trong trình so sánh của bạn sẽ * vẫn * được đánh dấu' const' vì nó không sửa đổi bất kỳ thành viên nào. –

10

std::list đã một built-in sort phương pháp mà bạn cần sử dụng kể từ std::sort chỉ làm việc với lặp truy cập ngẫu nhiên, trong khi std::list::iterator chỉ thuộc về lớp iterator hai chiều của vòng lặp.

Result.poly.sort(SortDescending()); 

Ngoài ra, operator() của bạn phải được đánh dấu const.

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

Cuối cùng, bạn không cần phải viết Comparer của riêng bạn cho rằng, chỉ cần sử dụng std::greater<T> (nằm trong tiêu đề chuẩn <functional>):

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

Không có điều này là không, không có gì trong tiêu chuẩn nói rằng điều này cần phải được const. Nếu bạn nhìn vào thông báo lỗi, có vẻ như toán tử '-' bị thiếu cho các vòng lặp đầu vào. –

+0

Nó sẽ làm cho một câu trả lời tốt hơn nếu nó được sắp xếp lại (const-ness là một vấn đề phụ ở đây). – visitor

+0

vẫn không hoạt động với bộ so sánh của chính tôi hoặc sử dụng lớn hơn() nó vẫn cung cấp một loạt lỗi – Vlad

4

Nó có vẻ như các loại iterator cho Result.poly là thiếu operator -. std::sort không làm việc với std::list thay đổi Result.poly.sort

+0

nhưng tôi không biết làm thế nào để quá tải chính xác các nhà điều hành ít hơn cho lớp học của tôi – Vlad

+0

@Vlad bạn có thể gọi điều này bằng 'Result.poly.sort (SortDescending())', không cần cho toán tử '<'. –

+0

@Konrad Tôi nghĩ anh ta đang nói về 'toán tử <' và đã bỏ lỡ sự thật rằng có một phiên bản 'std :: ist :: sort' có một vị từ. –

Các vấn đề liên quan