Trong thư viện phạm vi có hai loại hoạt động:
- Các khung nhìn lười biếng và yêu cầu vùng chứa bên dưới tồn tại.
- kết quả là những hành động háo hức và tạo ra các thùng chứa mới (hoặc sửa đổi những cái hiện có)
Lượt xem rất nhẹ. Bạn vượt qua chúng theo giá trị và yêu cầu các thùng chứa bên dưới vẫn còn hiệu lực và không thay đổi.
Từ tài liệu phạm vi-v3
Một khung nhìn là một trình bao bọc nhẹ thể hiện một khung nhìn của một chuỗi các phần tử bên dưới theo một cách tùy chỉnh nào đó mà không làm thay đổi hoặc sao chép nó. Lượt xem rẻ để tạo và sao chép và có ngữ nghĩa tham chiếu không sở hữu.
và:
Bất kỳ hoạt động nào trên phạm vi cơ bản làm mất hiệu lực các trình vòng lặp hoặc các câu lệnh của nó cũng sẽ làm mất hiệu lực bất kỳ chế độ xem nào đề cập đến bất kỳ phần nào của phạm vi đó.
Sự phá hủy của container bên dưới rõ ràng làm mất hiệu lực tất cả các trình vòng lặp với nó.
Trong mã của bạn, bạn đặc biệt sử dụng các khung nhìn - Bạn sử dụng ranges::views::transform
. Các ống chỉ đơn thuần là một đường cú pháp để làm cho nó dễ dàng để viết theo cách của nó. Bạn nên nhìn vào thứ cuối cùng trong đường ống để xem những gì bạn sản xuất - trong trường hợp của bạn, đó là một góc nhìn.
Nếu không có người vận hành đường ống, nó có thể trông giống như thế này:
ranges::views::transform(my_custom_rng_gen(some_param), my_transform_op)
nếu có nhiều biến đổi được kết nối theo cách đó bạn có thể thấy nó sẽ xấu đến mức nào.
Do đó, nếu my_custom_rng_gen
tạo ra một loại container nào đó, mà bạn biến đổi và sau đó quay trở lại, container đó sẽ bị phá hủy và bạn có các tham chiếu lơ lửng từ quan điểm của mình. Nếu my_custom_rng_gen
là một góc nhìn khác về một container sống bên ngoài các phạm vi này, mọi thứ đều ổn.
Tuy nhiên, trình biên dịch sẽ có thể nhận ra rằng bạn đang áp dụng chế độ xem trên một bộ chứa tạm thời và đánh bạn với một lỗi biên dịch.
Nếu bạn muốn hàm của mình trả về một phạm vi dưới dạng một thùng chứa, bạn cần phải "cụ thể hóa" kết quả. Đối với điều đó, sử dụng ranges::to
toán tử trong hàm.
Cập nhật: Để dễ hiểu hơn về nhận xét của bạn "tài liệu nói rằng việc soạn phạm vi / đường ống lấy và lưu trữ chế độ xem ở đâu?"
Ống chỉ đơn thuần là một đường cú pháp để kết nối mọi thứ trong một biểu thức dễ đọc. Tùy thuộc vào cách nó được sử dụng, nó có thể hoặc không thể trả về một khung nhìn. Nó phụ thuộc vào đối số bên phải. Trong trường hợp của bạn, đó là:
`<some range> | ranges::views::transform(...)`
Vì vậy, biểu thức trả về bất cứ điều gì views::transform
trả về.
Bây giờ, bằng cách đọc tài liệu của biến đổi:
Dưới đây là danh sách các tổ hợp phạm vi lười biếng hoặc các chế độ xem mà Range-v3 cung cấp và giới thiệu về cách sử dụng từng tổ hợp.
[...]
views::transform
Đưa ra một phạm vi nguồn và một hàm unary, trả về một phạm vi mới trong đó mỗi phần tử kết quả là kết quả của việc áp dụng hàm unary cho một phần tử nguồn.
Vì vậy, nó trả về một phạm vi, nhưng vì nó là một toán tử lười biếng, nên phạm vi đó nó trả về là một khung nhìn, với tất cả các ngữ nghĩa của nó.