1. Vấn đề nó giải quyết
Thuật toán dựa trên hàng xóm cần cửa sổ chồng nhau. adjacent<N> C++23 tạo tuple gồm N phần tử liên tiếp, adjacent_transform<N> tính từ mỗi tuple, còn pairwise đặt tên trường hợp N = 2.
2. Kiến thức cần có
Ngày 42: range view tạo tuple.
Phép so sánh cửa sổ trượt cơ bản.
3. Ý tưởng cốt lõi
Di chuyển cửa sổ mỗi lần một phần tử. Khác chunk, các cửa sổ liên tiếp chồng nhau nên một phần tử nguồn có thể góp vào nhiều output. 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 [a, b] : values | std::views::pairwise) { }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 adjacent, adjacent-transform và pairwise.
Chương trình đọc các cặp hàng xóm và biến đổi có điều kiện thành hiệu.
Cuối cùng, nó in hoặc kiểm tra một kết quả cho mỗi cửa sổ chồng hợp lệ để dễ đối chiếu.
6. Lỗi thường gặp
Mong có output từ range ngắn hơn
Nlà sai; trả tham chiếu bắt nguồn từ source tạm có thể treo cùng view.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 tính delta, phát hiện xu hướng, so sánh cục bộ và phép tính rolling độ rộng cố định.
Tránh dùng khi chia lô không chồng, phù hợp hơn với
chunk.
8. Ví dụ đơn giản
Bộ theo dõi nhiệt độ dùng cặp liên tiếp để in thay đổi giữa hai số đo kề nhau. 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/43_adjacent_pairwise_views/main.cpp
#include <array>
#include <functional>
#include <iostream>
#include <ranges>
#include <version>
int main() {
#if defined(__cpp_lib_ranges_zip)
std::array values{2, 5, 9, 10};
for (auto [first, second] : values | std::views::pairwise)
std::cout << '(' << first << ',' << second << ") ";
std::cout << '\n';
for (int difference :
std::views::adjacent_transform<2>(values, std::minus<>{}))
std::cout << difference << ' ';
std::cout << '\n';
#else
std::cout << "adjacent and pairwise 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ó — Với input dài
mvàadjacent<N>, output dài bao nhiêu khim >= N, và vì sao không phảim / N?