2013-06-04 46 views
6

Tôi hiện đang học STL và tôi có một số điểm không chắc chắn về tìm và const iterators. Hãy nói rằng tôi có một chức năng tìm:C++ STL, hằng số vòng lặp, tìm()

some_stl_container::const_iterator found = myContainer.find(value); 

Sau đó tôi nên kiểm tra những gì tôi đã cho found chống const_iterator khác, hoặc là nó hợp lệ để thực hiện một kiểm tra đối với đơn giản là một iterator. Về cơ bản sẽ có được bất kỳ sự khác biệt giữa làm điều này:

if(found!=myContainer.cend()) 

và điều này:

if(found!=myContainer.end()) 

Các chàng đầu tiên chính xác hơn (ít nhất là với tôi), nhưng thứ hai sẽ làm việc tốt quá, phải không?

+0

bản sao có thể có của [const để so sánh các biến số không const, chúng hợp lệ] (http://stackoverflow.com/questions/16900498/const-to-non-const-iterator-comparisons-are-they- hợp lệ) – juanchopanza

+0

Xem xét rằng 'cend' không tồn tại cho đến khi C++ 11, phải có * một số * cách để làm điều đó. –

Trả lời

8

Tất cả các thùng chứa thư viện chuẩn đáp ứng yêu cầu Container::iterator được chuyển đổi thành Container::const_iterator. Vì vậy, cả hai so sánh đều hợp lệ và sẽ mang lại kết quả tương tự.

Từ §23.2.1 - Bảng 96

X::iterator... bất kỳ loại iterator đáp ứng các iterator về phía trước yêu cầu. chuyển đổi thành X::const_iterator.

+0

Điều thú vị là tôi chỉ cố gắng tìm xác nhận rằng 'x.cend() == X :: const_iterator (x.end())' trong một tiêu chuẩn. Và không tìm thấy một (có thể là tôi thiếu một số kết luận hợp lý rõ ràng). Theo định nghĩa 'x.cend() == const_cast (x) .end()' nhưng tôi không thấy điều này chứng tỏ sự khẳng định đầu tiên như thế nào. –

+0

@SergeDundich Tôi không chắc tôi hiểu câu hỏi của bạn. Những gì tôi trích dẫn rõ ràng nói rằng, khi nói đến container, 'iterator' được chuyển đổi thành' const_iterator'. Nếu bạn đang hỏi cái gì cho phép chúng ta sử dụng 'toán tử ==' để so sánh 2 vòng lặp, hãy tham khảo [câu trả lời này] (http://stackoverflow.com/a/16901637/241631) của tôi. – Praetorian

1

Kiểm tra xem trình lặp của bạn có khác với myContainer.end() không. Các phương thức cendcbegin chỉ có ở đây để thu được một cách rõ ràng các trình lặp const, do đó không có sự khác biệt trong trường hợp của bạn.

Lưu ý rằng bạn có thể làm auto found = myContainer.find(value) trong C++ 11 để suy ra loại trình lặp và một số người cho rằng Thư viện chuẩn là tên chính xác (không phải STL).

+1

Giới thiệu về nhận xét thứ hai của bạn: http://en.wikipedia.org/wiki/Standard_Template_Library – lightxbulb

+0

Tôi có nghĩa là http://en.wikipedia.org/wiki/C%2B%2B_Standard_Library thực tế khác với STL gốc (xem http://stackoverflow.com/questions/5205491/whats-this-stl-vs-c-standard-library-fight-all-about) nhưng đó là một đối số thuần túy có râu: p –

+0

@lightxbulb: Là bài viết bạn liên kết để mô tả, STL là một thư viện cổ truyền cảm hứng cho các bộ phận của thư viện chuẩn hiện đại. Câu hỏi của bạn là đặc biệt về Thư viện chuẩn C++ 11, không phải là STL (vì các container STL không có các hàm 'cend'). –