1. Vấn đề nó giải quyết
Chương trình thường duyệt các dãy liên quan cùng nhịp hoặc cần chỉ số bên cạnh phần tử. C++23 cung cấp view lười thay cho tự quản lý index hoặc tạo container tuple ngay.
2. Kiến thức cần có
Ngày 5: view lười và sentinel.
Ngày 41: range được container tiêu thụ.
3. Ý tưởng cốt lõi
zip kéo khóa từng vị trí và dừng theo input ngắn nhất. zip_transform áp hàm ngay, còn enumerate zip chỉ số sinh ra với giá trị. Hãy xác định giá trị đang được biến đổi rồi kiểm tra kiểu, lifetime hoặc quyền sở hữu kết quả. Bật C++23 chưa chắc thư viện đã triển khai đủ, vì vậy cần kiểm tra feature-test macro liên quan.
4. Cú pháp tối thiểu
for (auto [index, value] : std::views::enumerate(range)) { }5. Cách nó hoạt động
Ví dụ tạo biểu thức hoặc đối tượng nhỏ nhất cho View
zip,zip_transformvàenumerate.Chương trình ghép tên với điểm, kết hợp cặp số và enumerate giá trị khi các view tồn tại.
Cuối cùng, nó in hoặc kiểm tra cặp cùng nhịp và cặp index-value mà không cần container trung gian để dễ đối chiếu.
6. Lỗi thường gặp
Cho rằng zip chạy đến input dài nhất sẽ âm thầm mất dữ liệu; giữ tuple reference sau khi range nguồn chết tạo tham chiếu treo.
Không kiểm tra feature-test macro có thể chọn nhánh mã thư viện hiện tại chưa hỗ trợ.
7. Khi nào nên dùng
Nên dùng khi duyệt cùng nhịp các range liên quan có lifetime tương thích.
Tránh dùng khi input mà độ dài khác nhau là lỗi phải kiểm tra tường minh trước khi zip.
8. Ví dụ đơn giản
Báo cáo điểm zip tên sinh viên với điểm rồi enumerate các dòng kết quả để hiển thị. Chương trình dùng dữ liệu cố định để output dễ kiểm tra.
Mã mẫu hoàn chỉnh
Tệp mã nguồn
cpp23/42_zip_zip_transform_enumerate/main.cpp
#include <array>
#include <functional>
#include <iostream>
#include <ranges>
#include <string_view>
#include <version>
int main() {
#if defined(__cpp_lib_ranges_zip) && defined(__cpp_lib_ranges_enumerate)
std::array names{std::string_view{"A"}, std::string_view{"B"}};
std::array scores{7, 9};
for (auto [name, score] : std::views::zip(names, scores))
std::cout << name << ':' << score << ' ';
std::cout << '\n';
std::array left{1, 2};
std::array right{10, 20};
for (int sum : std::views::zip_transform(std::plus<>{}, left, right))
std::cout << sum << ' ';
std::cout << '\n';
for (auto [index, name] : std::views::enumerate(names))
std::cout << index << '=' << name << ' ';
std::cout << '\n';
#else
std::cout << "zip or enumerate views unavailable\n";
#endif
}
9. Điều cần nhớ
Tách quy tắc chuẩn khỏi mức hỗ trợ thực tế.
Làm rõ lifetime, ownership và kiểu suy luận.
Ưu tiên cú pháp ngắn, đúng ý định.
Guard tính năng chưa được hỗ trợ đồng đều.
10. Câu hỏi tự kiểm tra
Dễ — Cú pháp ngắn nhất ở Phần 4 là gì và nhiệm vụ chính của nó là gì?
Trung bình — Đọc chương trình mẫu: giá trị, kiểu hoặc nhánh nào được quan sát, và vì sao?
Khó — Nếu một range zip có ba phần tử và range kia có năm, size kết quả là bao nhiêu và cần kiểm tra gì khi không chấp nhận cắt ngắn?