2012-04-07 67 views
17

Kể từ khi là thành viên đệ begin()end() chức năng được bổ sung cho tiêu chuẩn chứa trong thư mục C++ 11 sửa đổi, tại sao có các phiên bản là thành viên đệ trong những chức năng rbegin()rend() không được cũng được thêm vào? Tôi cảm thấy ngớ ngẩn sau khi bắt đầu sử dụng các phiên bản không phải là begin()end(), chỉ để thấy rằng bây giờ tôi phải chuyển đổi giữa việc sử dụng các cuộc gọi hàm thành viên và không phải là thành viên. (Tôi nhận ra rằng nó sẽ là tầm thường để cuộn phiên bản của riêng tôi không phải là rbegin()rend(), nhưng tôi tự hỏi tại sao điều này không được thêm vào tiêu chuẩn).C++ 11: Administrators rbegin()/Rend() Chức năng

Cảm ơn bạn đã nhập.

+0

Tôi nhớ điều gì đó đang được nói về điều này trong một trong các bản trình bày tại [Going Native 2012] (http://channel9.msdn.com/Events/GoingNative/GoingNative-2012). Có vẻ như các chức năng này chỉ đơn giản là bị lãng quên và có thể (sẽ?) Được thêm vào trong tiêu chuẩn tại một điểm sau này. –

+0

Các hàm 'begin()' và 'end()' không phải là thành viên được sử dụng bởi dạng mới của câu lệnh 'for' được thêm vào C++ 11. Các chức năng khác thì không. –

Trả lời

5

Bạn có thể tạo phạm vi được đảo ngược bằng cách sử dụng thủ công std::reverse_iterator trên kết quả của std::beginstd::end.

Thật kỳ lạ, không có chức năng nhà máy chuẩn cho reverse_iterator. Nếu có, nó có lẽ sẽ giống như thế này:

template< typename iter > 
std::reverse_iterator<iter> reverse(iter i) 
    { return { i }; } 

vũ trang với điều này, bạn có thể làm

std::sort(reverse(std::end(my_array)), reverse(std::begin(my_array))); 

dụ này giúp tiết kiệm những rắc rối của quy định cụ thể so sánh std::greater, nhưng reverse_iterator conceivably có thể ảnh hưởng xấu đến hiệu suất nếu trình biên dịch không thể loại bỏ độ phức tạp thêm từ vòng trong.

7

Đối với những người xem thông tin này sau, số rbegin()rend() chưa có trong C++ 14.

+1

Yup! http://en.cppreference.com/w/cpp/iterator/rbegin – Johnsyweb

+1

Ha! Đó là những gì tôi mong đợi. Bởi vì tôi không thể thấy chi phí của việc thêm rbegin() dựa trên hàm start() nonmember. Embrace C++ 14! – 8090PZ