1. Vấn đề nó giải quyết
Pair và tuple gom vài giá trị khác kiểu; tie gán các trường tuple; chrono tạo đơn vị thời gian có kiểu; to_string đổi số thành chuỗi đơn giản. Nó làm ràng buộc quan trọng hiện rõ thay vì bắt người đọc đoán. Bài chỉ giữ phần cốt lõi C++11 vừa đủ cho một ngày tập trung.
2. Kiến thức cần có
Kiến thức Ngày 43, cùng biến, hàm và cách đọc output đã học trước đó.
3. Ý tưởng cốt lõi
Mental model: Pair và tuple gom vài giá trị khác kiểu; tie gán các trường tuple; chrono tạo đơn vị thời gian có kiểu; to_string đổi số thành chuỗi đơn giản. Hãy xác định giá trị hoặc trạng thái liên quan, ai sở hữu nó và quy tắc tác động lúc compile hay lúc chạy.
4. Cú pháp tối thiểu
std::tie(id, price) = std::make_tuple(7, 2.5); std::chrono::milliseconds ms(20);5. Cách nó hoạt động
Ví dụ tạo dữ liệu nhỏ, cố định và không cần nhập bàn phím.
C++11 hoặc contract thư viện chuẩn áp dụng quy tắc hôm nay.
Chương trình in kết quả quan trọng để đối chiếu với mã nguồn.
6. Lỗi thường gặp
Tuple lớn không có tên khó đọc vì vị trí mang ý nghĩa; class nhỏ phù hợp hơn khi các trường tạo khái niệm miền lâu dài.
7. Khi nào nên dùng
Nên dùng khi tạm thời trả về hoặc gom một nhóm nhỏ giá trị cố định.
Tránh dùng khi nó che ownership, lifetime, kiểu, thứ tự hoặc chi phí.
8. Ví dụ đơn giản
Pair lưu mã và tên, tie tháo tuple, còn milliseconds có kiểu được ghép vào thông báo qua to_string. File .cpp dùng dữ liệu cố định và không thêm abstraction ngoài chủ đề.
Mã mẫu hoàn chỉnh
Tệp mã nguồn
cpp11/44_pair_tuple_tie_chrono_to_string/main.cpp
#include <chrono>
#include <iostream>
#include <string>
#include <tuple>
#include <utility>
int main() {
std::pair<int, std::string> user = std::make_pair(7, "Ada");
std::tuple<int, double, bool> quote = std::make_tuple(9, 2.5, true);
int id = 0;
double price = 0.0;
bool valid = false;
std::tie(id, price, valid) = quote;
std::chrono::milliseconds delay(20);
const std::string message = std::to_string(delay.count()) + "ms";
std::cout << user.first << ':' << user.second << '\n';
std::cout << id << ',' << price << ',' << valid << '\n';
std::cout << message << '\n';
}
9. Điều cần nhớ
Tính năng nằm trong phạm vi C++11 của lộ trình này.
Hiểu hệ quả về lifetime, ownership, kiểu và thứ tự trước khi dùng.
Compile với cảnh báo và ưu tiên cách viết nhỏ nhất làm quy tắc hiện rõ.
10. Câu hỏi tự kiểm tra
Dễ —
std::pair/std::tuple,std::tie,std::chrono::millisecondsvàstd::to_stringlần lượt hỗ trợ gom giá trị, gán biến, biểu diễn thời gian và chuyển số như thế nào?Trung bình — Đọc ví dụ nhỏ ở trên. Chương trình sẽ in giá trị hoặc trạng thái nào, và quy tắc nào tạo ra kết quả đó?
Khó — Tìm và giải thích lỗi tinh tế trong tình huống sau: Tuple lớn không có tên khó đọc vì vị trí mang ý nghĩa; class nhỏ phù hợp hơn khi các trường tạo khái niệm miền lâu dài. Cách sửa nhỏ nhất nhưng an toàn trong C++11 là gì?