... chắc chắn rất hữu ích khi có tùy chọn vượt qua phạm vi. Nhưng ít nhất theo kinh nghiệm của tôi, đó là một trường hợp đặc biệt hiếm gặp. Tôi thường muốn hoạt động trên toàn bộ container
Nó có thể là một trường hợp đặc biệt hiếm gặp trong kinh nghiệm của bạn , nhưng trong thực tế, toàn bộ container là trường hợp đặc biệt và phạm vi tùy ý là trường hợp chung.
Bạn đã nhận thấy rằng bạn có thể triển khai toàn bộ thùng chứa bằng giao diện hiện tại, nhưng bạn không thể thực hiện ngược lại.
Vì vậy, người viết thư viện đã có sự lựa chọn giữa việc thực hiện hai giao diện lên phía trước hoặc chỉ thực hiện một giao diện vẫn bao gồm tất cả các trường hợp.
Thật dễ dàng để viết một hàm bao bọc lấy một container và các lệnh gọi start () và end () trên nó, nhưng các hàm tiện lợi như vậy không được bao gồm trong thư viện chuẩn
Đúng, đặc biệt là vì các chức năng miễn phí std::begin
và std::end
hiện được bao gồm.
Vì vậy, giả sử thư viện cung cấp quá tải tiện lợi:
template <typename Container>
void sort(Container &c) {
sort(begin(c), end(c));
}
bây giờ nó cũng cần cung cấp quá tải tương đương khi lấy functor so sánh, và chúng ta cần cung cấp các tương đương cho mọi thuật toán khác.
Nhưng ít nhất chúng tôi đã bao gồm mọi trường hợp chúng tôi muốn vận hành trên một container đầy đủ, phải không? Vâng, không hoàn toàn. Xem xét
std::for_each(c.rbegin(), c.rend(), foo);
Nếu chúng ta muốn xử lý hoạt động ngược trên các container, chúng ta cần một phương thức khác (hoặc cặp phương thức) cho mỗi thuật toán hiện có.
Vì vậy, cách tiếp cận dựa trên phạm vi là tổng quát hơn theo nghĩa đơn giản rằng:
- nó có thể làm mọi thứ mà phiên bản toàn container có thể
- cách tiếp cận toàn bộ container tăng gấp đôi hoặc gấp ba số lần quá tải cần thiết, trong khi vẫn kém mạnh mẽ hơn
- các thuật toán dựa trên phạm vi cũng có thể kết hợp được (bạn có thể xếp chồng hoặc xâu chuỗi các bộ điều hợp trình vòng lặp, mặc dù điều này thường được thực hiện trong các ngôn ngữ chức năng và Python)
Tất nhiên, có một lý do hợp lệ khác, đó là đã có rất nhiều công việc để đạt được tiêu chuẩn STL, và thổi phồng nó bằng các trình bao bọc tiện lợi trước khi nó được sử dụng rộng rãi sẽ không sử dụng nhiều thời gian của ủy ban hạn chế. Nếu bạn quan tâm, bạn có thể tìm thấy báo cáo kỹ thuật của Stepanov & Lee tại đây
Như đã đề cập trong các bình luận, Boost.Range cung cấp một cách tiếp cận mới hơn mà không yêu cầu thay đổi tiêu chuẩn.