Có sự khác biệt giữa an std::pairvà an std::tuplechỉ có hai thành viên không? (Bên cạnh điều hiển nhiên là std::pairyêu cầu hai và chỉ hai thành viên và tuplecó thể có nhiều hơn hoặc ít hơn ...)
Câu trả lời:
Có một số khác biệt:
std::tuplekhông bao giờ có thể theo bố cục tiêu chuẩn (ít nhất, nó không bắt buộc phải theo tiêu chuẩn). Mọi std::pair<T, Y>là bố cục tiêu chuẩn nếu cả hai Tvà Yđều là bố cục tiêu chuẩn.
Nó dễ dàng hơn một chút để lấy nội dung của a pairhơn a tuple. Bạn phải sử dụng một lời gọi hàm trong tupletrường hợp, trong khi pairtrường hợp chỉ là một trường thành viên.
Nhưng đó là về nó.
std::mapsử dụng std::pair<const Key,T>như là value_typechẵn trong C ++ 11. Chính xác thì các bộ giá trị được sử dụng ở std::mapđâu?
std::map.
Đây là một câu trả lời rất muộn nhưng lưu ý rằng, vì std::pairđược định nghĩa với các biến thành viên, kích thước của nó không thể được tối ưu hóa bằng cách sử dụng tối ưu hóa lớp cơ sở trống ( firstvà secondphải chiếm các địa chỉ riêng biệt, ngay cả khi một hoặc cả hai là một lớp trống). Điều này càng trở nên trầm trọng hơn bởi bất kỳ yêu cầu căn chỉnh second_typenào, vì vậy trong trường hợp xấu nhất, kết quả std::pairvề cơ bản sẽ gấp đôi kích thước mà nó cần.
std::tuplechỉ cho phép truy cập thông qua các chức năng trợ giúp, vì vậy nó có thể bắt nguồn từ một trong hai loại nếu một hoặc loại kia trống, tiết kiệm chi phí. Việc triển khai của GCC, ít nhất, chắc chắn làm được điều này ... bạn có thể xem qua các tiêu đề để xác minh điều này nhưng cũng có đây là bằng chứng.
[[no_unique_address]] nên loại bỏ std::pairnhược điểm của.
std::tupleTên của An dài hơn (thêm một ký tự). Nhiều ký tự trong số đó được nhập bằng tay phải, vì vậy hầu hết mọi người đều dễ dàng nhập hơn.
Điều đó nói rằng, std::pairchỉ có thể có hai giá trị - không phải 0, một, ba hoặc nhiều hơn. HAI giá trị. Tuy nhiên, một tuple hầu như không có giới hạn ngữ nghĩa về số lượng giá trị. std::pairDo đó, An là kiểu an toàn, chính xác hơn để sử dụng nếu bạn thực sự muốn chỉ định một cặp giá trị.
std::tuple<> là kiểu an toàn (làm sao mà không được?), Và không khác về mặt ngữ nghĩa . 2pair
Đối với những gì nó đáng giá, tôi thấy đầu ra GDB của std :: tuple khó đọc hơn nhiều. Rõ ràng nếu bạn cần nhiều hơn 2 giá trị thì std :: pair sẽ không hoạt động, nhưng tôi coi đây là một điểm có lợi cho cấu trúc.
std::get<0>(tupleName)trong một getter; GetX()dễ đọc hơn và ngắn hơn rất nhiều. Nó có một nhược điểm nhỏ là nếu bạn quên làm cho nó một constphương pháp ai đó có thể làm điều gì đó ngu ngốc như thế này: GetX() = 20;.
.firstvà.secondtiện dụng, nhưng họ không giúp gì nếu (các) thành viên thứ ba (hoặc nhiều hơn) được yêu cầu thay đổi mã. Tôi nhận thấy rằng tôi có xu hướng sử dụngstd::getbất kể trong bất kỳ Getters nào theo cách đó tôi không cần thay đổi mọi thứ, chỉ là các kiểu dữ liệu và bất kỳmake_pairlệnh gọi nàomake_tuple.