2016-11-27 25 views
6

Tôi đã trải qua tài liệu đối tượng hàm cho lớn hơn, ít hơn. Mặc dù tôi có thể hiểu được những gì trong đó, tôi vẫn chưa hiểu. Sẽ sử dụng một loại lớn hơn container của tôi theo thứ tự tăng dần hay giảm dần? Tôi đặc biệt bối rối vì hai dòng sau dường như đang làm những điều ngược lại.các đối tượng hàm lớn hơn/ít hơn trong C++

std::priority_queue<int, std::vector<int>, std::greater<int> > q2; 

for(int n : {1,8,5,6,3,4,0,9,7,2}) 
    q2.push(n); 

print_queue(p2); 

này in 0, 1, 2, 3, 4, 5, 6, 7, 8, 9. Nhưng,

int x[10] = { 1,3,5,7,9,2,4,6,8,10 }; 
std::sort(x,x+10,std::greater<int>()); 

In ấn này sẽ cung cấp cho 10, 9, 8, 7, 6, 5, 4, 3, 2, 1.

Sẽ rất tuyệt nếu ai đó có thể mô tả cách hoạt động 'lớn hơn' trong ví dụ của tôi, thay vì chỉ nói các tác phẩm 'lớn hơn' nói chung như thế nào.

+0

Bạn có thể thấy điều này hữu ích [nhầm lẫn về việc sử dụng std :: less và std :: lớn hơn với std :: sort] (http://stackoverflow.com/questions/14828476/confusion-about-using-stdless-and- stdgreater-with-stdsort) – MikeT

+0

@MikeT: Đã trải qua điều đó, vẫn còn có sự nhầm lẫn. Nhận được nhiều ý nghĩa hơn từ câu trả lời của Dai và StoryTeller, cảm ơn. –

Trả lời

4

Nó sẽ tăng dần, bạn sẽ luôn bật phần tử nhỏ nhất của hàng đợi. Một hàng đợi ưu tiên sắp xếp ngược lại với quan hệ thứ tự nó được đưa ra.

Định nghĩa mẫu mặc định trông như thế này:

template< 
    class T, 
    class Container = std::vector<T>, 
    class Compare = std::less<typename Container::value_type> 
> class priority_queue; 

Nó áp dụng less<>()(lhs, rhs) để có được "lớn nhất" yếu tố RHS. Nhưng trong trường hợp của bạn, nó sẽ áp dụng greater<>()(lhs, rhs) để có được phần tử rh "lớn nhất" (tất nhiên sẽ là phần tử nhỏ nhất). Mặt khác,

std::sort giữ nguyên loại thứ tự bạn cung cấp. Vì vậy, std::less sẽ sắp xếp theo thứ tự tăng dần và std::greater theo thứ tự giảm dần.

+0

Trong định nghĩa mẫu mặc định, priority_queue sử dụng std :: less. Vì vậy, theo mặc định, mà không sử dụng bất kỳ functor bên ngoài như lớn hơn, không nên nó in theo thứ tự tăng dần? Tại sao nó theo sau giảm dần theo mặc định? Xin lỗi, dường như một phần có được nó ngay bây giờ. Tuy nhiên, không thể thấy tại sao nó sẽ có được phần tử rh "lớn nhất" mặc dù. –

+0

@AshwinBaskaran, mẫu xử lý loại functor dưới dạng hộp đen. Hộp đen yêu cầu các phần tử theo một số quy tắc. Luôn luôn có một phần tử "lớn nhất" theo quy tắc, nhưng nó không phải là "lớn nhất" theo thứ tự thường xuyên của các số nguyên, nó có làm cho nó rõ ràng hơn không? – StoryTeller

+0

Vâng, tôi có thể hiểu điều đó ngay bây giờ. Các functors lớn/ít về cơ bản sắp xếp các số theo quy tắc. Theo mặc định, priority_queue sử dụng std :: less. Và tôi nghĩ ở đây, quy tắc là số "lớn nhất" là số có giá trị số nguyên thấp nhất. Vì vậy, điều đó sẽ xuất hiện đầu tiên. Và sẽ không priority_queue theo thứ tự tăng dần theo mặc định sau đó? Tôi biết tôi đang đi sai ở đâu đó, không thể tìm ra nơi đâu. –

1

std::greater<int> inverses thứ tự sắp xếp của các số nguyên.

std::priority_queuedequeues the next largest element by default, do đó, bằng cách sử dụng std::greater<int>, bạn sẽ đảo ngược thứ này để loại bỏ phần tử nhỏ nhất tiếp theo thay thế.

Tương tự, std::sort sẽ sắp xếp các phần tử theo thứ tự tăng dần theo mặc định, nhưng bằng cách sử dụng std::greater<int> bạn sẽ thấy thứ tự sắp xếp giảm dần.

+0

Điều này giúp dễ hiểu hơn. Vì vậy, nó là an toàn để nghĩ rằng lớn hơn sẽ luôn luôn đảo ngược thứ tự sắp xếp tự nhiên cho tất cả các container/container adapter? –

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