2012-01-05 29 views
8

Trong STL hiệu quả bởi Scott Meyers (trang 195) có dòng sau:Kiểm tra giá trị trả về của lower_bound so với trình lặp kết thúc

"Kết quả của lower_bound phải được kiểm tra để xem liệu nó có trỏ đến giá trị bạn đang Không giống như tìm kiếm, bạn không thể chỉ kiểm tra giá trị trả về của lower_bound đối với trình lặp kết thúc. "

Có ai giải thích tại sao bạn không thể làm điều này? dường như làm việc tốt cho tôi.

+0

Ngữ cảnh tại thời điểm đó trong sách là gì? Thật khó hiểu mà không biết cuốn sách đang nói về cái gì. Có phải nó đang nói về việc sử dụng 'lower_bound' để xem một giá trị có được đặt trong bộ không? – Justin

Trả lời

9

Nó hoạt động tốt cho bạn bởi vì yếu tố của bạn là hiện tại.

lower_bound trả về một iterator tới phần tử đầu tiên không ít hơn giá trị nhất định, và upper_bound trả về một iterator tới phần tử đầu tiên hơn hơn giá trị nhất định.

Với mảng 1, 2, 3, 3, 4, 6, 7, lower_bound(..., 5) sẽ trả về một iterator trỏ đến 6.

Do đó, hai cách để kiểm tra xem giá trị hiện diện:

  • Sử dụng equal_range để cũng nhận được upper_bound (máy tính riêng biệt lower_boundupper_bound có thể sẽ tối ưu hóa dưới mức). Nếu std::distance giữa các giới hạn lớn hơn 0 thì phần tử có mặt.

    1, 2, 3, 3, 4, 6, 7 
    std::distance(std::lower_bound(v.begin(),v.end(),5), std::upper_bound(v.begin(),v.end(),5)) == 0 // 6 is absent 
    std::distance(std::lower_bound(v.begin(),v.end(),3), std::upper_bound(v.begin(),v.end(),3)) == 2 // 3 is present 
    
  • Hãy so sánh các yếu tố được trỏ bởi biến lặp với giá trị của mình (với điều kiện khai thác !=< là mạch lạc), nhưng bạn phải chắc chắn rằng nó không trả lại lặp kết thúc.

    *(std::lower_bound(v.begin(), v.end(), 5)) != 5 
    

Bên cạnh đó, kể từ lower_bound là một thuật toán tìm kiếm nhị phân nó sẽ là không phù hợp để trở end nếu nguyên tố này không được tìm thấy. Trên thực tế, các trình vòng lặp được trả về bởi thuật toán này có thể được sử dụng như một gợi ý cho một thao tác chèn tiếp theo chẳng hạn.

+0

+1: Nhưng như Meyers nói trong cuốn sách đó, việc so sánh bình đẳng sẽ không phải lúc nào cũng hiệu quả (vì 'lower_bound' sử dụng' <', không phải' == '). –

+0

@Oli Charlesworth: Nếu bạn ghi đè '<', bạn có lẽ cũng nên ghi đè lên '== '. Câu trả lời được điều chỉnh. – Benoit

+2

Thậm chí nếu bạn làm, chúng sẽ không nhất thiết phải tương ứng: '==' tương ứng với "bình đẳng", '<' tương ứng với "tương đương". Xem khoản 19 của STL hiệu quả để thảo luận về điều này. –

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