Nếu front()
trả về tham chiếu và vùng chứa trống thì tôi sẽ nhận được gì, tham chiếu không xác định? Điều đó có nghĩa là tôi cần kiểm tra empty()
trước mỗi front()
?Tôi nhận được gì từ phía trước() của vùng chứa sản phẩm nào?
Trả lời
Bạn nhận được hành vi không xác định - bạn cần kiểm tra xem vùng chứa có chứa nội dung nào đó trống không() (kiểm tra xem vùng chứa có trống không) trước khi gọi hàm front().
Bạn nhận được hành vi không xác định.
Để kiểm tra phạm vi sử dụng tại (0). Nếu điều này không thành công, bạn sẽ nhận được ngoại lệ out_of_range
.
Hành vi không xác định
Bạn luôn phải chắc chắn vùng chứa của mình không trống trước khi gọi trước() trong trường hợp này. Gọi trống() như một nhân viên bảo vệ an toàn là tốt. Tất nhiên, tùy thuộc vào thiết kế chương trình của bạn, luôn luôn có một thùng chứa không có sản phẩm nào có thể là một tuyên bố bất biến cho phép bạn ngăn chặn và lưu các cuộc gọi để trống() mỗi khi bạn gọi phía trước(). Quay trở lại (hoặc ít nhất là trong một số phần của mã của bạn?)
Nhưng như đã nêu ở trên, nếu bạn muốn tránh hành vi không xác định trong chương trình của mình, hãy biến nó thành một bất biến mạnh.
Có, bạn có thể sử dụng 'at' như Graham được đề cập thay vì sử dụng mặt trước.
Nhưng, tại (0) chỉ có sẵn cho một số vùng chứa - vectơ, deque và không dành cho người khác - danh sách, hàng đợi, ngăn xếp. Trong những trường hợp này, bạn đã quay trở lại sự an toàn của kiểm tra 'trống'.
Bạn cũng có thể sử dụng trống(). –
Tôi ước họ đã cụ thể hơn khi họ thiết kế và chỉ định STL. Tôi nghĩ rằng một số lượng lớn các vấn đề và lỗi trong quá trình chuyển đổi C++ được gây ra bởi việc triển khai nền tảng-specifing của những "hành vi không xác định" này được khai thác bởi các lập trình viên không tốt. –
Quyết định làm một cái gì đó UB thường có nghĩa là có một số chi phí thay thế - trong trường hợp này ném một ngoại lệ, mà C++ luôn cố gắng tránh. –