2010-06-02 28 views
13

Có cách nào để viết điều kiện một dòng sẽ trả về true nếu vùng chứa STL được sắp xếp không? Container trong câu hỏi là std :: vectormột dòng khẳng định để kiểm tra nếu container STL được sắp xếp

Tôi có ý định sử dụng nó trong một assert

+3

Bạn không nên đặt các loại điều này trong một khẳng định. Các xác nhận là những thứ không bao giờ có thể xảy ra. Ném một ngoại lệ rất có thể là thích hợp hơn. Nếu được thông qua một vector chưa phân loại vi phạm một phương thức hoặc đối tượng hoạt động hợp đồng thì nó sẽ không ném khẳng định. Trường hợp ngoại lệ cung cấp lợi thế lớn hơn xác nhận và nên được sử dụng trong ưu tiên trong hầu hết các trường hợp. – radman

+1

@radman: Nếu họ không bao giờ có thể xảy ra, tại sao bạn lại khẳng định họ? Bạn cần định nghĩa ngữ cảnh! Ví dụ: khẳng định các biến thể lớp, nhưng ném khi các điều kiện tiên quyết của giao diện hoặc postconditions bị vi phạm. – ltjax

+0

@ltjax Quyền của bạn là một chút ngắn gọn. Assertions chủ yếu là để bắt lỗi lập trình, ngoại lệ là cho đầu vào xấu hoặc các vấn đề thời gian chạy không thể tránh khỏi. Tôi nghĩ rằng bất biến đẳng cấp là một ví dụ tốt về các xác nhận được sử dụng một cách chính xác. Xác nhận cơ bản cung cấp một sự đảm bảo cho mã theo sau chúng để xử lý lỗi xâm lấn được giảm thiểu và lỗi lập trình được bắt sớm và to. – radman

Trả lời

23

Sử dụng adjacent_find kết hợp với hàm functor ít hoặc lớn hơn.

Hạn chế:
Bạn nên biết liệu container được sắp xếp tăng dần hoặc giảm dần.

Nếu vector là nghĩa vụ phải được sắp xếp theo thứ tự tăng dần:

//Checks the first element where adjacent value where elem > nextElem 
//returns end if the vector is sorted! 
//Complexity is O(n) 
vector<int>::iterator pos = std::adjacent_find (aVec.begin(), aVec.end(), // range 
            std::greater<int>());    


if (pos == aVec.end()) 
{ 
    std::cout<<" sorted"<<endl; 
} 
else 
{ 
    std::cout<<"Not sorted"<<endl; 
} 
+0

Đánh bại tôi một giây. – GManNickG

+1

Bí quyết nổi tiếng, mặc dù không quá rõ ràng. May mắn thay C++ 0x giới thiệu hàm 'is_sorted' cho điều đó :) –

7

Bạn có thể sử dụng std::is_sorted (vec.begin(), vec.end()) để kiểm tra nếu nó được sắp xếp. Lưu ý, mặc dù, đây là O (n).

+6

'is_sorted' không phải là một phần của Thư viện chuẩn C++. –

+4

Nó nằm trong tiêu chuẩn C++ 0x - và vận chuyển với VC++ 2010 – corvuscorax

+0

@corvuscorax, có nó là trong C++ 0x, nhưng nó chỉ là dự thảo không may. [Tôi sẽ không sử dụng nó trong một mã sản xuất.] (Http://stackoverflow.com/questions/1754397/how-are-you-using-c0x-today) –

0

Tùy thuộc vào loại dữ liệu STL bạn muốn sử dụng.

Bản đồ đã được sắp xếp theo khóa cung cấp khóa đã quá tải so sánh toán tử. Bạn tốt để đến đây.

Danh sách yêu cầu bạn gọi hàm sắp xếp một cách rõ ràng. Bạn sẽ cần theo dõi xem bạn đã sắp xếp hay chưa.

Hy vọng điều này sẽ hữu ích.

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